Healthcare Provider Fraud Detection

March 2020

Preprocessing Data

In [1]:
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline

import warnings
warnings.filterwarnings("ignore")

pd.set_option('display.max_rows', 500)
pd.set_option('display.max_columns', 500)
In [2]:
ben = pd.read_csv('data/Train_Beneficiarydata-1542865627584.csv')
inp = pd.read_csv('data/Train_Inpatientdata-1542865627584.csv')
out = pd.read_csv('data/Train_Outpatientdata-1542865627584.csv')
label = pd.read_csv('data/Train-1542865627584.csv')
In [3]:
print(ben.shape)
ben.sample(2)
(138556, 25)
Out[3]:
BeneID DOB DOD Gender Race RenalDiseaseIndicator State County NoOfMonths_PartACov NoOfMonths_PartBCov ChronicCond_Alzheimer ChronicCond_Heartfailure ChronicCond_KidneyDisease ChronicCond_Cancer ChronicCond_ObstrPulmonary ChronicCond_Depression ChronicCond_Diabetes ChronicCond_IschemicHeart ChronicCond_Osteoporasis ChronicCond_rheumatoidarthritis ChronicCond_stroke IPAnnualReimbursementAmt IPAnnualDeductibleAmt OPAnnualReimbursementAmt OPAnnualDeductibleAmt
1778 BENE12904 1949-10-01 NaN 1 2 0 25 560 12 12 1 1 1 1 1 1 1 2 1 2 2 0 0 7220 270
15240 BENE27316 1928-06-01 NaN 2 1 0 33 400 12 12 1 1 2 2 2 2 2 2 2 1 2 0 0 330 170
In [4]:
print(inp.shape)
inp.sample(2)
(40474, 30)
Out[4]:
BeneID ClaimID ClaimStartDt ClaimEndDt Provider InscClaimAmtReimbursed AttendingPhysician OperatingPhysician OtherPhysician AdmissionDt ClmAdmitDiagnosisCode DeductibleAmtPaid DischargeDt DiagnosisGroupCode ClmDiagnosisCode_1 ClmDiagnosisCode_2 ClmDiagnosisCode_3 ClmDiagnosisCode_4 ClmDiagnosisCode_5 ClmDiagnosisCode_6 ClmDiagnosisCode_7 ClmDiagnosisCode_8 ClmDiagnosisCode_9 ClmDiagnosisCode_10 ClmProcedureCode_1 ClmProcedureCode_2 ClmProcedureCode_3 ClmProcedureCode_4 ClmProcedureCode_5 ClmProcedureCode_6
26363 BENE107712 CLM45863 2009-04-06 2009-04-11 PRV51842 12000 PHY341192 PHY355416 NaN 2009-04-06 49121 1068.0 2009-04-11 182 5070 7847 25000 4280 70705 4019 34830 V441 0389 NaN 9396.0 NaN NaN NaN NaN NaN
26238 BENE107277 CLM68748 2009-09-19 2009-09-24 PRV56416 8000 PHY379160 NaN NaN 2009-09-19 4280 1068.0 2009-09-24 302 42843 41400 51881 486 25000 5859 71590 4280 2449 NaN NaN NaN NaN NaN NaN NaN
In [5]:
print(out.shape)
out.sample(2)
(517737, 27)
Out[5]:
BeneID ClaimID ClaimStartDt ClaimEndDt Provider InscClaimAmtReimbursed AttendingPhysician OperatingPhysician OtherPhysician ClmDiagnosisCode_1 ClmDiagnosisCode_2 ClmDiagnosisCode_3 ClmDiagnosisCode_4 ClmDiagnosisCode_5 ClmDiagnosisCode_6 ClmDiagnosisCode_7 ClmDiagnosisCode_8 ClmDiagnosisCode_9 ClmDiagnosisCode_10 ClmProcedureCode_1 ClmProcedureCode_2 ClmProcedureCode_3 ClmProcedureCode_4 ClmProcedureCode_5 ClmProcedureCode_6 DeductibleAmtPaid ClmAdmitDiagnosisCode
433982 BENE135133 CLM168394 2009-01-31 2009-01-31 PRV53374 10 PHY334069 NaN NaN 59010 25000 78820 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0 NaN
149943 BENE54012 CLM715234 2009-12-05 2009-12-05 PRV52660 70 PHY347281 NaN NaN 4011 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0 NaN
In [6]:
print('columns in inpatient but not in outpatient: ', [i for i in inp.columns if i not in out.columns])
print('columns in outpatient but not in inpatient: ', [i for i in out.columns if i not in inp.columns])
columns in inpatient but not in outpatient:  ['AdmissionDt', 'DischargeDt', 'DiagnosisGroupCode']
columns in outpatient but not in inpatient:  []
In [7]:
inp['ClmType'] = 'inpatient'
out['ClmType'] = 'outpatient'
In [8]:
clm = pd.concat([inp, out], sort=False)
print(clm.shape)
clm.sample(2)
(558211, 31)
Out[8]:
BeneID ClaimID ClaimStartDt ClaimEndDt Provider InscClaimAmtReimbursed AttendingPhysician OperatingPhysician OtherPhysician AdmissionDt ClmAdmitDiagnosisCode DeductibleAmtPaid DischargeDt DiagnosisGroupCode ClmDiagnosisCode_1 ClmDiagnosisCode_2 ClmDiagnosisCode_3 ClmDiagnosisCode_4 ClmDiagnosisCode_5 ClmDiagnosisCode_6 ClmDiagnosisCode_7 ClmDiagnosisCode_8 ClmDiagnosisCode_9 ClmDiagnosisCode_10 ClmProcedureCode_1 ClmProcedureCode_2 ClmProcedureCode_3 ClmProcedureCode_4 ClmProcedureCode_5 ClmProcedureCode_6 ClmType
223365 BENE75132 CLM427474 2009-06-21 2009-07-11 PRV52154 1100 PHY357905 NaN PHY393731 NaN NaN 0.0 NaN NaN 5856 27541 5880 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN outpatient
413685 BENE129421 CLM614973 2009-10-05 2009-10-05 PRV51349 200 PHY372676 NaN NaN NaN 6824 60.0 NaN NaN 6803 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN outpatient
In [9]:
df = pd.merge(clm, ben, how='left', on='BeneID')
# df = pd.merge(df, label, how='left', on='Provider')
df = df.sort_values('ClaimStartDt').reset_index() # sort df by claim start date
df.drop('index', axis = 1, inplace = True)
print(df.shape)
(558211, 55)
In [10]:
df.head()
Out[10]:
BeneID ClaimID ClaimStartDt ClaimEndDt Provider InscClaimAmtReimbursed AttendingPhysician OperatingPhysician OtherPhysician AdmissionDt ClmAdmitDiagnosisCode DeductibleAmtPaid DischargeDt DiagnosisGroupCode ClmDiagnosisCode_1 ClmDiagnosisCode_2 ClmDiagnosisCode_3 ClmDiagnosisCode_4 ClmDiagnosisCode_5 ClmDiagnosisCode_6 ClmDiagnosisCode_7 ClmDiagnosisCode_8 ClmDiagnosisCode_9 ClmDiagnosisCode_10 ClmProcedureCode_1 ClmProcedureCode_2 ClmProcedureCode_3 ClmProcedureCode_4 ClmProcedureCode_5 ClmProcedureCode_6 ClmType DOB DOD Gender Race RenalDiseaseIndicator State County NoOfMonths_PartACov NoOfMonths_PartBCov ChronicCond_Alzheimer ChronicCond_Heartfailure ChronicCond_KidneyDisease ChronicCond_Cancer ChronicCond_ObstrPulmonary ChronicCond_Depression ChronicCond_Diabetes ChronicCond_IschemicHeart ChronicCond_Osteoporasis ChronicCond_rheumatoidarthritis ChronicCond_stroke IPAnnualReimbursementAmt IPAnnualDeductibleAmt OPAnnualReimbursementAmt OPAnnualDeductibleAmt
0 BENE136624 CLM31004 2008-11-27 2009-01-01 PRV55897 51000 PHY407408 PHY366859 NaN 2008-11-27 70700 1068.0 2009-01-01 941 V5875 5601 43882 53190 5849 70723 40390 V1254 41400 NaN 9904.0 3843.0 NaN NaN NaN NaN inpatient 1937-07-01 NaN 2 1 Y 39 680 12 12 2 1 1 2 1 2 1 1 2 2 2 108000 3204 22550 5650
1 BENE109092 CLM31001 2008-11-27 2009-01-01 PRV55832 10000 PHY402579 NaN PHY402579 2008-11-27 29570 1068.0 2009-01-01 876 29534 49120 27800 3019 4019 07070 25000 2724 V142 NaN NaN NaN NaN NaN NaN NaN inpatient 1926-03-01 NaN 2 1 0 38 320 12 12 1 1 2 2 1 1 1 1 1 2 2 16830 6204 1120 820
2 BENE151770 CLM31005 2008-11-28 2009-01-02 PRV51456 56000 PHY428454 PHY428454 NaN 2008-11-28 4240 1068.0 2009-01-02 309 41401 4240 30000 9971 E8781 5185 45829 2851 4019 NaN 3521.0 5185.0 NaN NaN NaN NaN inpatient 1915-07-01 NaN 2 1 0 5 140 12 12 2 2 2 2 2 2 2 1 2 2 2 59600 1068 580 160
3 BENE82606 CLM31006 2008-11-28 2009-01-02 PRV56588 18000 PHY356371 PHY415979 NaN 2008-11-28 7866 1068.0 2009-01-02 196 1625 2859 43310 42731 2724 53081 496 5128 2761 NaN 3249.0 NaN NaN NaN NaN NaN inpatient 1922-09-01 NaN 2 1 0 45 390 12 12 1 1 2 1 1 1 1 2 2 1 2 28240 2136 290 390
4 BENE50967 CLM31008 2008-11-29 2009-01-03 PRV55812 7000 PHY392116 NaN NaN 2008-11-29 2989 1068.0 2009-01-03 058 3310 3079 56400 2971 7424 5990 3051 4019 7291 NaN NaN NaN NaN NaN NaN NaN inpatient 1919-02-01 NaN 2 2 0 37 150 12 12 1 1 1 2 2 2 1 1 1 1 1 11000 2136 1570 1260
In [11]:
# understand the quantity of misisng values
missing_values_count = df.isnull().sum().sort_values(ascending=False)
missing_values_per = round((missing_values_count/len(df)) * 100,2)
miss = pd.concat([missing_values_count, missing_values_per], axis=1, keys = ['Quant Missing values', 'Percentage Missing values - %']).reset_index()
miss[miss['Percentage Missing values - %']!=0]
Out[11]:
index Quant Missing values Percentage Missing values - %
0 ClmProcedureCode_6 558211 100.00
1 ClmProcedureCode_5 558202 100.00
2 ClmProcedureCode_4 558093 99.98
3 ClmProcedureCode_3 557242 99.83
4 DOD 554080 99.26
5 ClmDiagnosisCode_10 553201 99.10
6 ClmProcedureCode_2 552721 99.02
7 ClmProcedureCode_1 534901 95.82
8 AdmissionDt 517737 92.75
9 DischargeDt 517737 92.75
10 DiagnosisGroupCode 517737 92.75
11 ClmDiagnosisCode_9 516396 92.51
12 ClmDiagnosisCode_8 504767 90.43
13 ClmDiagnosisCode_7 492034 88.14
14 ClmDiagnosisCode_6 473819 84.88
15 ClmDiagnosisCode_5 446287 79.95
16 OperatingPhysician 443764 79.50
17 ClmAdmitDiagnosisCode 412312 73.86
18 ClmDiagnosisCode_4 393675 70.52
19 OtherPhysician 358475 64.22
20 ClmDiagnosisCode_3 315156 56.46
21 ClmDiagnosisCode_2 195606 35.04
22 ClmDiagnosisCode_1 10453 1.87
23 AttendingPhysician 1508 0.27
24 DeductibleAmtPaid 899 0.16

Note: Only inpatient data has columns AdmissionDt, DischargeDt and DiagnosisGroupCode.Actually no missing value for these 3 columns if only consider for inpatient data.

In [12]:
# # drop columns with missing value over 50%
# drop_list = [i for i in miss[miss['Percentage Missing values - %']>50]['index'] if i not in ['AdmissionDt', 'DischargeDt', 'DiagnosisGroupCode']]
# df.drop(drop_list, axis = 1, inplace = True)
In [13]:
# distinct number of provider
df.Provider.nunique()
Out[13]:
5410

After merging and cleaning the data, we have 558,211 claim records for 5,410 distinct provider. There are 38 columns in total, including the targeted variable "PotentialFraud".

Demographic EDA

In [14]:
demo_list = list(ben.columns)
demo_list.append('Provider')
demo = df[demo_list]
demo.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 558211 entries, 0 to 558210
Data columns (total 26 columns):
BeneID                             558211 non-null object
DOB                                558211 non-null object
DOD                                4131 non-null object
Gender                             558211 non-null int64
Race                               558211 non-null int64
RenalDiseaseIndicator              558211 non-null object
State                              558211 non-null int64
County                             558211 non-null int64
NoOfMonths_PartACov                558211 non-null int64
NoOfMonths_PartBCov                558211 non-null int64
ChronicCond_Alzheimer              558211 non-null int64
ChronicCond_Heartfailure           558211 non-null int64
ChronicCond_KidneyDisease          558211 non-null int64
ChronicCond_Cancer                 558211 non-null int64
ChronicCond_ObstrPulmonary         558211 non-null int64
ChronicCond_Depression             558211 non-null int64
ChronicCond_Diabetes               558211 non-null int64
ChronicCond_IschemicHeart          558211 non-null int64
ChronicCond_Osteoporasis           558211 non-null int64
ChronicCond_rheumatoidarthritis    558211 non-null int64
ChronicCond_stroke                 558211 non-null int64
IPAnnualReimbursementAmt           558211 non-null int64
IPAnnualDeductibleAmt              558211 non-null int64
OPAnnualReimbursementAmt           558211 non-null int64
OPAnnualDeductibleAmt              558211 non-null int64
Provider                           558211 non-null object
dtypes: int64(21), object(5)
memory usage: 110.7+ MB
In [15]:
demo.DOB = pd.to_datetime(demo.DOB, format = '%Y-%m-%d')
demo.DOD = pd.to_datetime(demo.DOD, format = '%Y-%m-%d')
demo['isDead']= 0
demo.loc[demo.DOD.notna(),'isDead'] = 1
demo= demo.replace({'ChronicCond_Alzheimer': 2, 'ChronicCond_Heartfailure': 2, 'ChronicCond_KidneyDisease': 2,
                           'ChronicCond_Cancer': 2, 'ChronicCond_ObstrPulmonary': 2, 'ChronicCond_Depression': 2, 
                           'ChronicCond_Diabetes': 2, 'ChronicCond_IschemicHeart': 2, 'ChronicCond_Osteoporasis': 2, 
                           'ChronicCond_rheumatoidarthritis': 2, 'ChronicCond_stroke': 2, 'Gender': 2 }, 0)
demo = demo.replace({'RenalDiseaseIndicator': 'Y'}, 1).astype({'RenalDiseaseIndicator': 'int64'})
In [16]:
df1 = demo.groupby(['Provider'], as_index = False)[['Gender', 'RenalDiseaseIndicator', 
                                                  'ChronicCond_Alzheimer', 'ChronicCond_Heartfailure',
                                                  'ChronicCond_KidneyDisease', 'ChronicCond_Cancer', 
                                                  'ChronicCond_ObstrPulmonary', 'ChronicCond_Depression', 
                                                  'ChronicCond_Diabetes', 'ChronicCond_IschemicHeart', 
                                                  'ChronicCond_Osteoporasis', 'ChronicCond_rheumatoidarthritis',
                                                  'ChronicCond_stroke', 'isDead']].sum()

CountBene = demo[['BeneID']].groupby(demo['Provider']).count().reset_index().rename(columns={'BeneID':'CountBene'})

df1 = df1.merge(CountBene, on='Provider', how='left')

df1.loc[:, df1.columns != 'Provider'] = df1.iloc[:,1:].div(df1.CountBene, axis=0)
df1.drop('CountBene', axis = 1, inplace = True)
In [17]:
df2 = demo[['BeneID']].groupby(demo['Provider']).nunique().reset_index().rename(columns={'BeneID':'DistinctBene'})

df3 = demo.groupby(['Provider'], as_index = False)[['NoOfMonths_PartACov', 'NoOfMonths_PartBCov',
                                                    'IPAnnualReimbursementAmt', 'IPAnnualDeductibleAmt',
                                                    'OPAnnualReimbursementAmt', 'OPAnnualDeductibleAmt']].mean()

demo_agg = df2.merge(df1, on='Provider', how='left').merge(df3, on='Provider', how='left').merge(label, on='Provider', how='left')
In [18]:
demo_agg = demo_agg.replace({'PotentialFraud': 'No'}, 0)
demo_agg = demo_agg.replace({'PotentialFraud': 'Yes'}, 1)
In [19]:
demo_agg.sample(2)
Out[19]:
Provider DistinctBene Gender RenalDiseaseIndicator ChronicCond_Alzheimer ChronicCond_Heartfailure ChronicCond_KidneyDisease ChronicCond_Cancer ChronicCond_ObstrPulmonary ChronicCond_Depression ChronicCond_Diabetes ChronicCond_IschemicHeart ChronicCond_Osteoporasis ChronicCond_rheumatoidarthritis ChronicCond_stroke isDead NoOfMonths_PartACov NoOfMonths_PartBCov IPAnnualReimbursementAmt IPAnnualDeductibleAmt OPAnnualReimbursementAmt OPAnnualDeductibleAmt PotentialFraud
43 PRV51058 75 0.457831 0.168675 0.373494 0.530120 0.409639 0.108434 0.277108 0.481928 0.746988 0.795181 0.373494 0.313253 0.108434 0.000000 12.000000 12.000000 5430.240964 628.048193 2156.144578 663.975904 0
1040 PRV52298 144 0.481651 0.247706 0.463303 0.591743 0.440367 0.165138 0.316514 0.532110 0.756881 0.798165 0.302752 0.243119 0.055046 0.004587 11.724771 11.724771 7924.311927 661.779817 2382.431193 766.467890 0
In [20]:
demo_agg.describe()
Out[20]:
DistinctBene Gender RenalDiseaseIndicator ChronicCond_Alzheimer ChronicCond_Heartfailure ChronicCond_KidneyDisease ChronicCond_Cancer ChronicCond_ObstrPulmonary ChronicCond_Depression ChronicCond_Diabetes ChronicCond_IschemicHeart ChronicCond_Osteoporasis ChronicCond_rheumatoidarthritis ChronicCond_stroke isDead NoOfMonths_PartACov NoOfMonths_PartBCov IPAnnualReimbursementAmt IPAnnualDeductibleAmt OPAnnualReimbursementAmt OPAnnualDeductibleAmt PotentialFraud
count 5410.000000 5410.000000 5410.000000 5410.000000 5410.000000 5410.000000 5410.000000 5410.000000 5410.000000 5410.000000 5410.000000 5410.000000 5410.000000 5410.000000 5410.000000 5410.000000 5410.000000 5410.000000 5410.000000 5410.000000 5410.000000 5410.000000
mean 67.153420 0.419175 0.196768 0.404218 0.594383 0.420224 0.153260 0.322807 0.436831 0.707307 0.765842 0.320718 0.309094 0.104631 0.007246 11.919716 11.930647 6166.692586 666.980865 2199.335651 629.095618 0.093530
std 142.748729 0.181585 0.147006 0.182290 0.183746 0.190397 0.133056 0.176796 0.181678 0.168950 0.153917 0.171529 0.168559 0.113676 0.031529 0.395682 0.310612 6203.422910 623.108956 1301.128843 344.104149 0.291201
min 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
25% 8.000000 0.340909 0.125000 0.333333 0.518519 0.333333 0.083333 0.241856 0.363636 0.651475 0.708333 0.250000 0.230769 0.032551 0.000000 11.994207 11.965836 2902.238095 356.000000 1547.500000 459.656897 0.000000
50% 25.000000 0.419355 0.188265 0.400000 0.598485 0.413793 0.142857 0.315165 0.437037 0.714286 0.770492 0.317073 0.307692 0.090909 0.000000 12.000000 12.000000 4729.047927 527.580008 2044.355263 592.510504 0.000000
75% 65.000000 0.500000 0.250000 0.484848 0.666667 0.500000 0.197452 0.392494 0.500000 0.785714 0.839304 0.385388 0.375000 0.137931 0.004673 12.000000 12.000000 7336.173195 801.000000 2557.354123 726.026854 0.000000
max 2857.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 12.000000 12.000000 103000.000000 12068.000000 22853.333333 6070.000000 1.000000
In [21]:
# demo_agg.to_csv('demo_agg.csv')
In [101]:
def heatMap(df):
    #Create Correlation df
    corr = df.corr()
    #Plot figsize
    fig, ax = plt.subplots(figsize=(20, 20))
    #Generate Color Map
    colormap = sns.diverging_palette(220, 10, as_cmap=True)
    #Generate Heat Map, allow annotations and place floats in map
    sns.heatmap(corr, cmap=colormap, annot=True, fmt=".2f")
    #Apply xticks
    plt.xticks(range(len(corr.columns)), corr.columns);
    #Apply yticks
    plt.yticks(range(len(corr.columns)), corr.columns)
    #show plot
    plt.show()
In [102]:
heatMap(demo_agg)
In [175]:
# plot continuous feature
def plot_con(df, col_name, full_name, ratio=True):
    
    # Plot without ProtentialFraud
    if ratio==False:
        f, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(12,4), dpi=90)
        sns.distplot(df.loc[df[col_name].notnull(), col_name], kde=False, ax=ax1)
        ax1.set_xlabel(full_name)
        ax1.set_ylabel('Count')
        ax1.set_title(full_name)
    else:
        f, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(10,4), dpi=90)
        sns.boxplot(y=col_name, data=df, ax=ax1)
        ax1.set_xlabel(full_name)
        ax1.set_ylabel('Ratio')
        ax1.set_title(full_name)

    # Plot with ProtentialFraud
    sns.boxplot(x='PotentialFraud', y=col_name, data=df, ax=ax2)
    ax2.set_ylabel(full_name)
    ax2.set_title(full_name + ' by PotentailFault or Not')
    ax2.set_xlabel('PotentailFault or Not')
    
    plt.tight_layout()
In [172]:
demo_agg.columns
Out[172]:
Index(['Provider', 'DistinctBene', 'Gender', 'RenalDiseaseIndicator',
       'ChronicCond_Alzheimer', 'ChronicCond_Heartfailure',
       'ChronicCond_KidneyDisease', 'ChronicCond_Cancer',
       'ChronicCond_ObstrPulmonary', 'ChronicCond_Depression',
       'ChronicCond_Diabetes', 'ChronicCond_IschemicHeart',
       'ChronicCond_Osteoporasis', 'ChronicCond_rheumatoidarthritis',
       'ChronicCond_stroke', 'isDead', 'NoOfMonths_PartACov',
       'NoOfMonths_PartBCov', 'IPAnnualReimbursementAmt',
       'IPAnnualDeductibleAmt', 'OPAnnualReimbursementAmt',
       'OPAnnualDeductibleAmt', 'PotentialFraud'],
      dtype='object')

Chronic Condition

In [189]:
ChronicCond_list = ['ChronicCond_Alzheimer', 'ChronicCond_Heartfailure',
       'ChronicCond_KidneyDisease', 'ChronicCond_Cancer',
       'ChronicCond_ObstrPulmonary', 'ChronicCond_Depression',
       'ChronicCond_Diabetes', 'ChronicCond_IschemicHeart',
       'ChronicCond_Osteoporasis', 'ChronicCond_rheumatoidarthritis',
       'ChronicCond_stroke']
ChronicCond = demo_agg[ChronicCond_list+['PotentialFraud']]
ChronicCond = pd.melt(ChronicCond, id_vars=['PotentialFraud'], value_vars=ChronicCond_list)
In [199]:
ChronicCond = ChronicCond.replace({'ChronicCond_':''}, regex=True)
In [213]:
ax = sns.catplot(data=ChronicCond, x='variable', y='value', hue='PotentialFraud', kind='box', height = 4, aspect = 4)

ax.fig.subplots_adjust(top=0.9)
ax.fig.suptitle('Chronic Condition By Potential Fraud', fontsize=18)
Out[213]:
Text(0.5, 0.98, 'Chronic Condition By Potential Fraud')

Distinct Number of Beneficiary

In [176]:
# DistinctBene = demo_agg[demo_agg['DistinctBene']<=demo_agg.DistinctBene.quantile(0.99)]
plot_con(demo_agg, 'DistinctBene', 'Distinct Number of Beneficiary', ratio=False)

Gender

In [174]:
plot_con(demo_agg, 'Gender', 'Ratio of Male')

Renal Disease

In [169]:
plot_con(demo_agg, 'RenalDiseaseIndicator', 'Renal Disease')

Inpatient Reimbursement Amount

In [221]:
plot_con(demo_agg, 'IPAnnualReimbursementAmt', 'IPAnnualReimbursementAmt', ratio=False)

Inpatient Deductible Amount

In [222]:
plot_con(demo_agg, 'IPAnnualDeductibleAmt', 'IPAnnualDeductibleAmt', ratio=False)

Outpatient Reimbursement Amount

In [223]:
plot_con(demo_agg, 'OPAnnualReimbursementAmt', 'OPAnnualReimbursementAmt', ratio=False)

Outpatient Deductible Amount

In [224]:
plot_con(demo_agg, 'OPAnnualDeductibleAmt', 'OPAnnualDeductibleAmt', ratio=False)

Claims EDA

Aggregation

In [0]:
# load the package
from datetime import date
import numpy as np
import pandas as pd
from scipy import stats
import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline
plt.rcParams['figure.figsize'] = (8, 6)
sns.set()
import warnings
warnings.filterwarnings('ignore')
In [0]:
# load the data
patient = pd.read_csv('Train_Beneficiarydata-1542865627584.csv')
inpatient = pd.read_csv('Train_Inpatientdata-1542865627584.csv')
outpatient = pd.read_csv('Train_Outpatientdata-1542865627584.csv')
fraud = pd.read_csv('Train-1542865627584.csv', index_col = 'Provider')

Fraud

In [0]:
# map 'No' to 0 and 'Yes' to 1
fraud_map = {'No': 0, 'Yes': 1}
fraud.PotentialFraud = fraud.PotentialFraud.map(fraud_map)

# plot potential fraud distribution
sns.countplot(x = 'PotentialFraud', data = fraud)
plt.title('Potential Provider Fraud Distribution')
plt.show()

Inpatient & Outpatient

In [0]:
inpatient.drop(['DiagnosisGroupCode', 'ClmAdmitDiagnosisCode', 'ClmDiagnosisCode_1',
       'ClmDiagnosisCode_10', 'ClmDiagnosisCode_2', 'ClmDiagnosisCode_3',
       'ClmDiagnosisCode_4', 'ClmDiagnosisCode_5', 'ClmDiagnosisCode_6',
       'ClmDiagnosisCode_7', 'ClmDiagnosisCode_8', 'ClmDiagnosisCode_9',  
       'ClmProcedureCode_1', 'ClmProcedureCode_2', 'ClmProcedureCode_3',
       'ClmProcedureCode_4', 'ClmProcedureCode_5', 'ClmProcedureCode_6'], axis = 1, inplace = True)

outpatient.drop(['ClmAdmitDiagnosisCode', 'ClmDiagnosisCode_1',
       'ClmDiagnosisCode_10', 'ClmDiagnosisCode_2', 'ClmDiagnosisCode_3',
       'ClmDiagnosisCode_4', 'ClmDiagnosisCode_5', 'ClmDiagnosisCode_6',
       'ClmDiagnosisCode_7', 'ClmDiagnosisCode_8', 'ClmDiagnosisCode_9',  
       'ClmProcedureCode_1', 'ClmProcedureCode_2', 'ClmProcedureCode_3',
       'ClmProcedureCode_4', 'ClmProcedureCode_5', 'ClmProcedureCode_6'], axis = 1, inplace = True)
In [0]:
inpatient.shape
Out[0]:
(40474, 12)
In [0]:
outpatient.shape
Out[0]:
(517737, 10)
In [0]:
# check missing values
def missing_val(df):
    missing = df.isnull().sum()
    missing_percentage = (df.isnull().sum()/len(df)*100).round(2)
    missing_val = pd.concat([missing, missing_percentage], axis = 1)
    missing_val.columns = ['Missing Values', '% Missing']
    total_columns = df.shape[1]
    missing_columns = (df.isnull().sum() > 0).sum()
    print('Out of {} columns, {} columns have missing values'.format(total_columns, missing_columns))
    return missing_val
In [0]:
missing_val(inpatient)
Out of 12 columns, 4 columns have missing values
Out[0]:
Missing Values % Missing
BeneID 0 0.00
ClaimID 0 0.00
ClaimStartDt 0 0.00
ClaimEndDt 0 0.00
Provider 0 0.00
InscClaimAmtReimbursed 0 0.00
AttendingPhysician 112 0.28
OperatingPhysician 16644 41.12
OtherPhysician 35784 88.41
AdmissionDt 0 0.00
DeductibleAmtPaid 899 2.22
DischargeDt 0 0.00
In [0]:
missing_val(outpatient)
Out of 10 columns, 3 columns have missing values
Out[0]:
Missing Values % Missing
BeneID 0 0.00
ClaimID 0 0.00
ClaimStartDt 0 0.00
ClaimEndDt 0 0.00
Provider 0 0.00
InscClaimAmtReimbursed 0 0.00
AttendingPhysician 1396 0.27
OperatingPhysician 427120 82.50
OtherPhysician 322691 62.33
DeductibleAmtPaid 0 0.00
In [0]:
# merge data
inpatient['In'] = 1
outpatient['Out'] = 1
patientDOB = patient[['BeneID', 'DOB']]

claims = inpatient.append(outpatient)
claims = claims.merge(patientDOB, how = 'left', on = 'BeneID')
In [0]:
claims.shape
Out[0]:
(558211, 15)
In [0]:
claims.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 558211 entries, 0 to 558210
Data columns (total 15 columns):
AdmissionDt               40474 non-null object
AttendingPhysician        556703 non-null object
BeneID                    558211 non-null object
ClaimEndDt                558211 non-null object
ClaimID                   558211 non-null object
ClaimStartDt              558211 non-null object
DeductibleAmtPaid         557312 non-null float64
DischargeDt               40474 non-null object
In                        40474 non-null float64
InscClaimAmtReimbursed    558211 non-null int64
OperatingPhysician        114447 non-null object
OtherPhysician            199736 non-null object
Out                       517737 non-null float64
Provider                  558211 non-null object
DOB                       558211 non-null object
dtypes: float64(3), int64(1), object(11)
memory usage: 68.1+ MB
In [0]:
claims.head()
Out[0]:
AdmissionDt AttendingPhysician BeneID ClaimEndDt ClaimID ClaimStartDt DeductibleAmtPaid DischargeDt In InscClaimAmtReimbursed OperatingPhysician OtherPhysician Out Provider DOB
0 2009-04-12 PHY390922 BENE11001 2009-04-18 CLM46614 2009-04-12 1068.0 2009-04-18 1.0 26000 NaN NaN NaN PRV55912 1943-01-01
1 2009-08-31 PHY318495 BENE11001 2009-09-02 CLM66048 2009-08-31 1068.0 2009-09-02 1.0 5000 PHY318495 NaN NaN PRV55907 1943-01-01
2 2009-09-17 PHY372395 BENE11001 2009-09-20 CLM68358 2009-09-17 1068.0 2009-09-20 1.0 5000 NaN PHY324689 NaN PRV56046 1943-01-01
3 2009-02-14 PHY369659 BENE11011 2009-02-22 CLM38412 2009-02-14 1068.0 2009-02-22 1.0 5000 PHY392961 PHY349768 NaN PRV52405 1914-03-01
4 2009-08-13 PHY379376 BENE11014 2009-08-30 CLM63689 2009-08-13 1068.0 2009-08-30 1.0 10000 PHY398258 NaN NaN PRV56614 1938-04-01
In [0]:
# convert all date variables to datetime datatype
claims.DOB = pd.to_datetime(claims.DOB)
claims.AdmissionDt = pd.to_datetime(claims.AdmissionDt)
claims.DischargeDt = pd.to_datetime(claims.DischargeDt)
claims.ClaimStartDt = pd.to_datetime(claims.ClaimStartDt)
claims.ClaimEndDt = pd.to_datetime(claims.ClaimEndDt)
In [0]:
# derive patient age
claims['Age'] = round(((claims.ClaimStartDt - claims.DOB).dt.days)/365, 0)
In [0]:
claims.describe(include = 'all')
Out[0]:
AdmissionDt AttendingPhysician BeneID ClaimEndDt ClaimID ClaimStartDt DeductibleAmtPaid DischargeDt In InscClaimAmtReimbursed OperatingPhysician OtherPhysician Out Provider DOB Age
count 40474 556703 558211 558211 558211 558211 557312.000000 40474 40474.0 558211.000000 114447 199736 517737.0 558211 558211 558211.000000
unique 398 82063 138556 366 558211 398 NaN 365 NaN NaN 35315 46457 NaN 5410 900 NaN
top 2009-02-10 00:00:00 PHY330576 BENE42721 2009-03-03 00:00:00 CLM268995 2009-01-31 00:00:00 NaN 2009-02-11 00:00:00 NaN NaN PHY330576 PHY412132 NaN PRV51459 1943-12-01 00:00:00 NaN
freq 144 2534 29 1707 1 1709 NaN 153 NaN NaN 424 1247 NaN 8240 2072 NaN
first 2008-11-27 00:00:00 NaN NaN 2008-12-28 00:00:00 NaN 2008-11-27 00:00:00 NaN 2009-01-01 00:00:00 NaN NaN NaN NaN NaN NaN 1909-01-01 00:00:00 NaN
last 2009-12-31 00:00:00 NaN NaN 2009-12-31 00:00:00 NaN 2009-12-31 00:00:00 NaN 2009-12-31 00:00:00 NaN NaN NaN NaN NaN NaN 1983-12-01 00:00:00 NaN
mean NaN NaN NaN NaN NaN NaN 78.421085 NaN 1.0 997.012133 NaN NaN 1.0 NaN NaN 73.348424
std NaN NaN NaN NaN NaN NaN 274.016812 NaN 0.0 3821.534891 NaN NaN 0.0 NaN NaN 13.030396
min NaN NaN NaN NaN NaN NaN 0.000000 NaN 1.0 0.000000 NaN NaN 1.0 NaN NaN 25.000000
25% NaN NaN NaN NaN NaN NaN 0.000000 NaN 1.0 40.000000 NaN NaN 1.0 NaN NaN 68.000000
50% NaN NaN NaN NaN NaN NaN 0.000000 NaN 1.0 80.000000 NaN NaN 1.0 NaN NaN 74.000000
75% NaN NaN NaN NaN NaN NaN 0.000000 NaN 1.0 300.000000 NaN NaN 1.0 NaN NaN 82.000000
max NaN NaN NaN NaN NaN NaN 1068.000000 NaN 1.0 125000.000000 NaN NaN 1.0 NaN NaN 101.000000
In [0]:
# Only keep 2009 data
claims = claims.loc[claims.ClaimStartDt >= date(2009, 1, 1)]
In [0]:
claims.describe(include = 'all')
Out[0]:
AdmissionDt AttendingPhysician BeneID ClaimEndDt ClaimID ClaimStartDt DeductibleAmtPaid DischargeDt In InscClaimAmtReimbursed OperatingPhysician OtherPhysician Out Provider DOB Age InpatientDays
count 39788 554012 555506 555506 555506 555506 554643.000000 39788 39788.0 555506.000000 113677 199217 515718.0 555506 555506 555506.000000 39788.000000
unique 367 81849 138423 365 555506 365 NaN 365 NaN NaN 35176 46383 NaN 5408 900 NaN NaN
top 2009-02-10 00:00:00 PHY330576 BENE59303 2009-03-03 00:00:00 CLM268995 2009-01-31 00:00:00 NaN 2009-02-11 00:00:00 NaN NaN PHY330576 PHY412132 NaN PRV51459 1943-12-01 00:00:00 NaN NaN
freq 144 2525 29 1707 1 1709 NaN 153 NaN NaN 424 1244 NaN 8208 2065 NaN NaN
first 2008-12-29 00:00:00 NaN NaN 2009-01-01 00:00:00 NaN 2009-01-01 00:00:00 NaN 2009-01-01 00:00:00 NaN NaN NaN NaN NaN NaN 1909-01-01 00:00:00 NaN NaN
last 2009-12-31 00:00:00 NaN NaN 2009-12-31 00:00:00 NaN 2009-12-31 00:00:00 NaN 2009-12-31 00:00:00 NaN NaN NaN NaN NaN NaN 1983-12-01 00:00:00 NaN NaN
mean NaN NaN NaN NaN NaN NaN 77.537744 NaN 1.0 981.503638 NaN NaN 1.0 NaN NaN 73.349107 5.575425
std NaN NaN NaN NaN NaN NaN 272.534687 NaN 0.0 3763.811367 NaN NaN 0.0 NaN NaN 13.029457 5.524285
min NaN NaN NaN NaN NaN NaN 0.000000 NaN 1.0 0.000000 NaN NaN 1.0 NaN NaN 25.000000 0.000000
25% NaN NaN NaN NaN NaN NaN 0.000000 NaN 1.0 40.000000 NaN NaN 1.0 NaN NaN 68.000000 2.000000
50% NaN NaN NaN NaN NaN NaN 0.000000 NaN 1.0 80.000000 NaN NaN 1.0 NaN NaN 74.000000 4.000000
75% NaN NaN NaN NaN NaN NaN 0.000000 NaN 1.0 300.000000 NaN NaN 1.0 NaN NaN 82.000000 7.000000
max NaN NaN NaN NaN NaN NaN 1068.000000 NaN 1.0 125000.000000 NaN NaN 1.0 NaN NaN 101.000000 35.000000

Age

In [0]:
sns.distplot(claims.Age)
plt.title('Distribution of Patients Age')
plt.show()
In [0]:
# average age of patients
AvgAge = claims.groupby('Provider').agg({'Age': 'mean'})
AvgAge.columns = ['AvgAge']
AvgAge.head()
Out[0]:
AvgAge
Provider
PRV51001 78.160000
PRV51003 69.480916
PRV51004 71.778523
PRV51005 70.118659
PRV51007 68.791667

AdmissionDT, DischargeDt

In [0]:
# inpatient days
claims['InpatientDays'] = (claims.DischargeDt - claims.AdmissionDt).dt.days

sns.distplot(claims.InpatientDays.dropna())
plt.title('Distribution of the Number of Inpatient Days')
plt.show()
In [0]:
def groupby_provider(col, func, freq = 'M'):
    temp = claims[['ClaimStartDt', 'Provider', col]]
    temp.set_index('ClaimStartDt', inplace = True)

    group = pd.DataFrame(temp.groupby([pd.Grouper(freq='M'), 'Provider']).agg(func))
    group.reset_index(inplace = True)
    group = group.pivot(index = 'Provider', columns = 'ClaimStartDt', values = col)
    group.columns = group.columns.strftime('%Y-%m-%d')
    return group
In [0]:
# average number of inpatient days per month
InpatientDays = groupby_provider('InpatientDays', 'mean')
InpatientDays = InpatientDays.add_prefix('InDays')
InpatientDays.fillna(0, inplace = True)
InpatientDays.head()
Out[0]:
InDays2009-01-31 InDays2009-02-28 InDays2009-03-31 InDays2009-04-30 InDays2009-05-31 InDays2009-06-30 InDays2009-07-31 InDays2009-08-31 InDays2009-09-30 InDays2009-10-31 InDays2009-11-30 InDays2009-12-31
Provider
PRV51001 0.0 2.5 0.00 0.0 8.0 0.0 4.000000 0.0 0.0 0.0 0.0 0.0
PRV51003 4.5 4.0 3.25 5.0 8.0 1.2 5.833333 3.6 8.4 6.0 6.6 3.0
PRV51004 0.0 0.0 0.00 0.0 0.0 0.0 0.000000 0.0 0.0 0.0 0.0 0.0
PRV51005 0.0 0.0 0.00 0.0 0.0 0.0 0.000000 0.0 0.0 0.0 0.0 0.0
PRV51007 0.0 0.0 7.00 0.0 4.0 0.0 0.000000 5.0 0.0 0.0 0.0 0.0
In [0]:
# standard deviation
InpatientDays_Std = pd.DataFrame(InpatientDays.std(axis = 1), columns = ['InDaysStd'])
InpatientDays_Std.head()
Out[0]:
InDaysStd
Provider
PRV51001 2.499621
PRV51003 2.121219
PRV51004 0.000000
PRV51005 0.000000
PRV51007 2.498484
In [0]:
# mean
InpatientDays_Mean = pd.DataFrame(InpatientDays.mean(axis = 1), columns = ['InDaysMean'])
InpatientDays_Mean.head()
Out[0]:
InDaysMean
Provider
PRV51001 1.208333
PRV51003 4.948611
PRV51004 0.000000
PRV51005 0.000000
PRV51007 1.333333
In [0]:
# total inpatient days
InpatientDays_Sum = claims.groupby('Provider').agg({'InpatientDays': sum})
InpatientDays_Sum.columns = ['TotalInDays']
InpatientDays_Sum.head()
Out[0]:
TotalInDays
Provider
PRV51001 25.0
PRV51003 305.0
PRV51004 0.0
PRV51005 0.0
PRV51007 16.0

AttendingPhysician

In [0]:
AttendingPhysician = pd.DataFrame(claims.groupby('Provider')['AttendingPhysician'].nunique())
AttendingPhysician.head()
Out[0]:
AttendingPhysician
Provider
PRV51001 14
PRV51003 44
PRV51004 38
PRV51005 6
PRV51007 10

BeneID

In [0]:
# number of unique patients per month
UniqueBeneID = groupby_provider('BeneID', pd.Series.nunique)
UniqueBeneID = UniqueBeneID.add_prefix('PatientUNo')
UniqueBeneID.fillna(0, inplace = True)
UniqueBeneID.head()
Out[0]:
PatientUNo2009-01-31 PatientUNo2009-02-28 PatientUNo2009-03-31 PatientUNo2009-04-30 PatientUNo2009-05-31 PatientUNo2009-06-30 PatientUNo2009-07-31 PatientUNo2009-08-31 PatientUNo2009-09-30 PatientUNo2009-10-31 PatientUNo2009-11-30 PatientUNo2009-12-31
Provider
PRV51001 2.0 4.0 3.0 2.0 5.0 3.0 2.0 1.0 1.0 0.0 0.0 2.0
PRV51003 13.0 16.0 10.0 10.0 7.0 14.0 11.0 13.0 9.0 11.0 11.0 5.0
PRV51004 12.0 19.0 18.0 10.0 8.0 11.0 14.0 10.0 12.0 11.0 8.0 16.0
PRV51005 86.0 80.0 94.0 83.0 71.0 82.0 83.0 87.0 91.0 91.0 66.0 70.0
PRV51007 6.0 5.0 9.0 3.0 9.0 9.0 3.0 6.0 7.0 2.0 6.0 6.0
In [0]:
# standard deviation
unibene_Std = pd.DataFrame(UniqueBeneID.std(axis = 1), columns = ['UniBeneStd'])
unibene_Std.head()
Out[0]:
UniBeneStd
Provider
PRV51001 1.505042
PRV51003 3.010084
PRV51004 3.629634
PRV51005 8.913728
PRV51007 2.391589
In [0]:
# mean
unibene_Mean = pd.DataFrame(UniqueBeneID.mean(axis = 1), columns = ['UniBeneMean'])
unibene_Mean.head()
Out[0]:
UniBeneMean
Provider
PRV51001 2.083333
PRV51003 10.833333
PRV51004 12.416667
PRV51005 82.000000
PRV51007 5.916667
In [0]:
# total patients
total_patients = claims.groupby('Provider').agg({'BeneID': 'nunique'})
total_patients.columns = ['TotalPatients']
total_patients.head()
Out[0]:
TotalPatients
Provider
PRV51001 24
PRV51003 117
PRV51004 138
PRV51005 495
PRV51007 58

ClaimStartDt, ClaimEndDt

In [0]:
# create variable: claim duration
claims['ClaimDays'] = (claims.ClaimEndDt - claims.ClaimStartDt).dt.days

sns.distplot(claims.ClaimDays)
plt.title('Distribution of the Number of Days between Claim Start and Claim End')

plt.show()
In [0]:
# Inpatient and Outpatient
figure, axes = plt.subplots(1, 2, figsize=(14, 5), sharex = True)

sns.distplot(claims.loc[claims.In == 1, 'ClaimDays'], ax = axes[0])
axes[0].set_title('Inpatient')

sns.distplot(claims.loc[claims.Out == 1, 'ClaimDays'], ax = axes[1])
axes[1].set_title('Outpatient')

plt.suptitle('Distribution of the Number of Days between Claim Start and Claim End', fontsize = 15)
plt.show()
In [0]:
# monthly average claim days
ClaimDays = groupby_provider('ClaimDays', 'mean')
ClaimDays = ClaimDays.add_prefix('ClaimDays')
ClaimDays.fillna(0, inplace = True)
ClaimDays.head()
Out[0]:
ClaimDays2009-01-31 ClaimDays2009-02-28 ClaimDays2009-03-31 ClaimDays2009-04-30 ClaimDays2009-05-31 ClaimDays2009-06-30 ClaimDays2009-07-31 ClaimDays2009-08-31 ClaimDays2009-09-30 ClaimDays2009-10-31 ClaimDays2009-11-30 ClaimDays2009-12-31
Provider
PRV51001 0.000000 3.500000 0.333333 0.000000 3.400000 0.000000 2.000000 0.000000 0.000000 0.000000 0.000000 0.000000
PRV51003 3.615385 2.750000 6.100000 4.800000 6.500000 2.000000 3.181818 3.076923 4.666667 2.727273 3.636364 0.600000
PRV51004 1.666667 0.631579 0.666667 2.000000 2.625000 0.090909 0.357143 3.600000 3.333333 2.090909 0.000000 1.437500
PRV51005 1.382353 0.821782 1.132743 1.295918 1.722892 0.902913 0.380435 1.676768 1.523364 0.369369 0.643836 0.753086
PRV51007 0.000000 0.000000 0.777778 0.000000 1.000000 2.222222 0.000000 3.333333 1.857143 0.000000 0.000000 0.000000
In [0]:
# standard deviation
ClaimDays_Std = pd.DataFrame(ClaimDays.std(axis = 1), columns = ['ClaimDaysStd'])
ClaimDays_Std.head()
Out[0]:
ClaimDaysStd
Provider
PRV51001 1.375651
PRV51003 1.671003
PRV51004 1.229821
PRV51005 0.475384
PRV51007 1.130750
In [0]:
# mean
ClaimDays_Mean = pd.DataFrame(ClaimDays.mean(axis = 1), columns = ['ClaimDaysMean'])
ClaimDays_Mean.head()
Out[0]:
ClaimDaysMean
Provider
PRV51001 0.769444
PRV51003 3.637869
PRV51004 1.541642
PRV51005 1.050455
PRV51007 0.765873

ClaimID

In [0]:
# number of claims per month
ClaimID = groupby_provider('ClaimID', 'count')
ClaimID = ClaimID.add_prefix('ClaimNo')
ClaimID.fillna(0, inplace = True)
ClaimID.head()
Out[0]:
ClaimNo2009-01-31 ClaimNo2009-02-28 ClaimNo2009-03-31 ClaimNo2009-04-30 ClaimNo2009-05-31 ClaimNo2009-06-30 ClaimNo2009-07-31 ClaimNo2009-08-31 ClaimNo2009-09-30 ClaimNo2009-10-31 ClaimNo2009-11-30 ClaimNo2009-12-31
Provider
PRV51001 2.0 4.0 3.0 2.0 5.0 3.0 2.0 1.0 1.0 0.0 0.0 2.0
PRV51003 13.0 16.0 10.0 10.0 8.0 14.0 11.0 13.0 9.0 11.0 11.0 5.0
PRV51004 12.0 19.0 18.0 10.0 8.0 11.0 14.0 10.0 12.0 11.0 8.0 16.0
PRV51005 102.0 101.0 113.0 98.0 83.0 103.0 92.0 99.0 107.0 111.0 73.0 81.0
PRV51007 6.0 5.0 9.0 4.0 9.0 9.0 3.0 6.0 7.0 2.0 6.0 6.0
In [0]:
# standard deviation
ClaimNum_Std = pd.DataFrame(ClaimID.std(axis = 1), columns = ['ClaimNumStd'])
ClaimNum_Std.head()
Out[0]:
ClaimNumStd
Provider
PRV51001 1.505042
PRV51003 2.906367
PRV51004 3.629634
PRV51005 12.383701
PRV51007 2.296242
In [0]:
# mean
ClaimNum_Mean = pd.DataFrame(ClaimID.mean(axis = 1), columns = ['ClaimNumMean'])
ClaimNum_Mean.head()
Out[0]:
ClaimNumMean
Provider
PRV51001 2.083333
PRV51003 10.916667
PRV51004 12.416667
PRV51005 96.916667
PRV51007 6.000000
In [0]:
# total claims
total_claim = claims.groupby('Provider').agg({'ClaimID': 'count'})
total_claim.columns = ['TotalClaim']
total_claim.head()
Out[0]:
TotalClaim
Provider
PRV51001 25
PRV51003 131
PRV51004 149
PRV51005 1163
PRV51007 72

DeductibleAmtPaid

In [0]:
# average deductible amount paid per month
DeductibleAmtPaid = groupby_provider('DeductibleAmtPaid', 'mean')
DeductibleAmtPaid = DeductibleAmtPaid.add_prefix('Deductible')
DeductibleAmtPaid.fillna(0, inplace = True)
DeductibleAmtPaid.head()
Out[0]:
Deductible2009-01-31 Deductible2009-02-28 Deductible2009-03-31 Deductible2009-04-30 Deductible2009-05-31 Deductible2009-06-30 Deductible2009-07-31 Deductible2009-08-31 Deductible2009-09-30 Deductible2009-10-31 Deductible2009-11-30 Deductible2009-12-31
Provider
PRV51001 0.000000 534.000000 0.000000 0.000000 427.200000 0.000000 534.000000 0.000000 0.000000 0.000000 0.000000 0.000000
PRV51003 492.923077 600.750000 427.200000 647.800000 534.000000 381.428571 582.545455 410.769231 593.333333 485.454545 485.454545 213.600000
PRV51004 2.500000 0.000000 0.000000 10.000000 0.000000 0.000000 0.714286 0.000000 0.000000 10.000000 0.000000 3.750000
PRV51005 4.019608 3.366337 2.477876 7.142857 5.903614 1.359223 1.413043 2.828283 1.214953 1.711712 3.424658 4.444444
PRV51007 0.000000 0.000000 119.777778 0.000000 118.666667 0.000000 16.666667 178.000000 0.000000 0.000000 0.000000 0.000000
In [0]:
# standard deviation
Deductible_Std = pd.DataFrame(DeductibleAmtPaid.std(axis = 1), columns = ['DeductibleStd'])
Deductible_Std.head()
Out[0]:
DeductibleStd
Provider
PRV51001 226.938101
PRV51003 119.373275
PRV51004 3.816630
PRV51005 1.870401
PRV51007 63.788121
In [0]:
# mean
Deductible_Mean = pd.DataFrame(DeductibleAmtPaid.mean(axis = 1), columns = ['DeductibleMean'])
Deductible_Mean.head()
Out[0]:
DeductibleMean
Provider
PRV51001 124.600000
PRV51003 487.938230
PRV51004 2.247024
PRV51005 3.275551
PRV51007 36.092593
In [0]:
# total deductible
total_deductible = claims.groupby('Provider').agg({'DeductibleAmtPaid': sum})
total_deductible.columns = ['TotalDeductible']
total_deductible.head()
Out[0]:
TotalDeductible
Provider
PRV51001 5340.0
PRV51003 65218.0
PRV51004 310.0
PRV51005 3700.0
PRV51007 3264.0

In

In [0]:
# number of inpatient patients per month
In = groupby_provider('In', 'count')
In = In.add_prefix('In')
In.fillna(0, inplace = True)
In.head()
Out[0]:
In2009-01-31 In2009-02-28 In2009-03-31 In2009-04-30 In2009-05-31 In2009-06-30 In2009-07-31 In2009-08-31 In2009-09-30 In2009-10-31 In2009-11-30 In2009-12-31
Provider
PRV51001 0.0 2.0 0.0 0.0 2.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0
PRV51003 6.0 9.0 4.0 6.0 4.0 5.0 6.0 5.0 5.0 5.0 5.0 1.0
PRV51004 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
PRV51005 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
PRV51007 0.0 0.0 1.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0
In [0]:
# standard deviation
In_Std = pd.DataFrame(In.std(axis = 1), columns = ['InStd'])
In_Std.head()
Out[0]:
InStd
Provider
PRV51001 0.792961
PRV51003 1.831955
PRV51004 0.000000
PRV51005 0.000000
PRV51007 0.452267
In [0]:
# mean
In_Mean = pd.DataFrame(In.mean(axis = 1), columns = ['InMean'])
In_Mean.head()
Out[0]:
InMean
Provider
PRV51001 0.416667
PRV51003 5.083333
PRV51004 0.000000
PRV51005 0.000000
PRV51007 0.250000
In [0]:
# total inpatients
total_in = claims.groupby('Provider').agg({'In': sum})
total_in.columns = ['TotalInpatients']
total_in.head()
Out[0]:
TotalInpatients
Provider
PRV51001 5.0
PRV51003 61.0
PRV51004 0.0
PRV51005 0.0
PRV51007 3.0

InscClaimAmtReimbursed

In [0]:
# average reimbursement amount paid per month
InscClaimAmtReimbursed = groupby_provider('InscClaimAmtReimbursed', 'mean')
InscClaimAmtReimbursed = InscClaimAmtReimbursed.add_prefix('Reimbursed')
InscClaimAmtReimbursed.fillna(0, inplace = True)
InscClaimAmtReimbursed.head()
Out[0]:
Reimbursed2009-01-31 Reimbursed2009-02-28 Reimbursed2009-03-31 Reimbursed2009-04-30 Reimbursed2009-05-31 Reimbursed2009-06-30 Reimbursed2009-07-31 Reimbursed2009-08-31 Reimbursed2009-09-30 Reimbursed2009-10-31 Reimbursed2009-11-30 Reimbursed2009-12-31
Provider
PRV51001 505.000000 2025.000000 216.666667 800.000000 11000.000000 196.666667 18035.000000 400.000000 300.000000 0.000000 0.000000 460.000000
PRV51003 5036.923077 8034.375000 4194.000000 3370.000000 5437.500000 2098.571429 6206.363636 3473.846154 4187.777778 3990.000000 5134.545455 1526.000000
PRV51004 377.500000 254.210526 290.555556 512.000000 406.250000 422.727273 524.285714 74.000000 491.666667 390.000000 42.500000 371.875000
PRV51005 181.176471 253.465347 235.398230 203.469388 228.915663 239.417476 334.782609 253.838384 321.214953 211.891892 184.246575 236.049383
PRV51007 51.666667 292.000000 561.111111 120.000000 776.666667 155.555556 1136.666667 1951.666667 184.285714 265.000000 38.333333 141.666667
In [0]:
# standard deviation
Insc_Std = pd.DataFrame(InscClaimAmtReimbursed.std(axis = 1), columns = ['InscStd'])
Insc_Std.head()
Out[0]:
InscStd
Provider
PRV51001 5687.465416
PRV51003 1763.852707
PRV51004 157.037498
PRV51005 47.486238
PRV51007 571.114142
In [0]:
# mean
Insc_Mean = pd.DataFrame(InscClaimAmtReimbursed.mean(axis = 1), columns = ['InscMean'])
Insc_Mean.head()
Out[0]:
InscMean
Provider
PRV51001 2828.194444
PRV51003 4390.825211
PRV51004 346.464228
PRV51005 240.322197
PRV51007 472.884921
In [0]:
# total insurance paid amount
total_insc = claims.groupby('Provider').agg({'InscClaimAmtReimbursed': sum})
total_insc.columns = ['TotalInsc']
total_insc.head()
Out[0]:
TotalInsc
Provider
PRV51001 104640
PRV51003 601670
PRV51004 52170
PRV51005 280670
PRV51007 33710

OperatingPhysician

In [0]:
OperatingPhysician = pd.DataFrame(claims.groupby('Provider')['OperatingPhysician'].nunique())
OperatingPhysician.head()
Out[0]:
OperatingPhysician
Provider
PRV51001 5
PRV51003 7
PRV51004 19
PRV51005 6
PRV51007 5

OtherPhysician

In [0]:
OtherPhysician = pd.DataFrame(claims.groupby('Provider')['OtherPhysician'].nunique())
OtherPhysician.head()
Out[0]:
OtherPhysician
Provider
PRV51001 8
PRV51003 22
PRV51004 26
PRV51005 4
PRV51007 7

Out

In [0]:
# number of outpatient patients per month
Out = groupby_provider('Out', 'count')
Out = Out.add_prefix('Out')
Out.fillna(0, inplace = True)
Out.head()
Out[0]:
Out2009-01-31 Out2009-02-28 Out2009-03-31 Out2009-04-30 Out2009-05-31 Out2009-06-30 Out2009-07-31 Out2009-08-31 Out2009-09-30 Out2009-10-31 Out2009-11-30 Out2009-12-31
Provider
PRV51001 2.0 2.0 3.0 2.0 3.0 3.0 1.0 1.0 1.0 0.0 0.0 2.0
PRV51003 7.0 7.0 6.0 4.0 4.0 9.0 5.0 8.0 4.0 6.0 6.0 4.0
PRV51004 12.0 19.0 18.0 10.0 8.0 11.0 14.0 10.0 12.0 11.0 8.0 16.0
PRV51005 102.0 101.0 113.0 98.0 83.0 103.0 92.0 99.0 107.0 111.0 73.0 81.0
PRV51007 6.0 5.0 8.0 4.0 8.0 9.0 3.0 5.0 7.0 2.0 6.0 6.0
In [0]:
# standard deviation
Out_Std = pd.DataFrame(Out.std(axis = 1), columns = ['OutStd'])
Out_Std.head()
Out[0]:
OutStd
Provider
PRV51001 1.073087
PRV51003 1.696699
PRV51004 3.629634
PRV51005 12.383701
PRV51007 2.094365
In [0]:
# mean
Out_Mean = pd.DataFrame(Out.mean(axis = 1), columns = ['OutMean'])
Out_Mean.head()
Out[0]:
OutMean
Provider
PRV51001 1.666667
PRV51003 5.833333
PRV51004 12.416667
PRV51005 96.916667
PRV51007 5.750000
In [0]:
# total outpatients
total_out = claims.groupby('Provider').agg({'Out': sum})
total_out.columns = ['TotalOutpatients']
total_out.head()
Out[0]:
TotalOutpatients
Provider
PRV51001 20.0
PRV51003 70.0
PRV51004 149.0
PRV51005 1163.0
PRV51007 69.0

Data Merging

In [0]:
df = AttendingPhysician.join(AvgAge)
df = df.join(InpatientDays_Std)
df = df.join(InpatientDays_Mean)
df = df.join(InpatientDays_Sum)
df = df.join(unibene_Std)
df = df.join(unibene_Mean)
df = df.join(total_patients)
df = df.join(ClaimDays_Std)
df = df.join(ClaimDays_Mean)
df = df.join(ClaimNum_Std)
df = df.join(ClaimNum_Mean)
df = df.join(total_claim)
df = df.join(Deductible_Std)
df = df.join(Deductible_Mean)
df = df.join(total_deductible)
df = df.join(In_Std)
df = df.join(In_Mean)
df = df.join(total_in)
df = df.join(Insc_Std)
df = df.join(Insc_Mean)
df = df.join(total_insc)
df = df.join(OperatingPhysician)
df = df.join(OtherPhysician)
df = df.join(Out_Std)
df = df.join(Out_Mean)
df = df.join(total_out)
df = df.join(fraud)
df.shape
Out[0]:
(5408, 28)
In [0]:
df.head()
Out[0]:
AttendingPhysician AvgAge InDaysStd InDaysMean TotalInDays UniBeneStd UniBeneMean TotalPatients ClaimDaysStd ClaimDaysMean ... TotalInpatients InscStd InscMean TotalInsc OperatingPhysician OtherPhysician OutStd OutMean TotalOutpatients PotentialFraud
Provider
PRV51001 14 78.160000 2.499621 1.208333 25.0 1.505042 2.083333 24 1.375651 0.769444 ... 5.0 5687.465416 2828.194444 104640 5 8 1.073087 1.666667 20.0 0
PRV51003 44 69.480916 2.121219 4.948611 305.0 3.010084 10.833333 117 1.671003 3.637869 ... 61.0 1763.852707 4390.825211 601670 7 22 1.696699 5.833333 70.0 1
PRV51004 38 71.778523 0.000000 0.000000 0.0 3.629634 12.416667 138 1.229821 1.541642 ... 0.0 157.037498 346.464228 52170 19 26 3.629634 12.416667 149.0 0
PRV51005 6 70.118659 0.000000 0.000000 0.0 8.913728 82.000000 495 0.475384 1.050455 ... 0.0 47.486238 240.322197 280670 6 4 12.383701 96.916667 1163.0 1
PRV51007 10 68.791667 2.498484 1.333333 16.0 2.391589 5.916667 58 1.130750 0.765873 ... 3.0 571.114142 472.884921 33710 5 7 2.094365 5.750000 69.0 0

5 rows × 28 columns

In [0]:
missing_val(df)
Out of 28 columns, 0 columns have missing values
Out[0]:
Missing Values % Missing
AttendingPhysician 0 0.0
AvgAge 0 0.0
InDaysStd 0 0.0
InDaysMean 0 0.0
TotalInDays 0 0.0
UniBeneStd 0 0.0
UniBeneMean 0 0.0
TotalPatients 0 0.0
ClaimDaysStd 0 0.0
ClaimDaysMean 0 0.0
ClaimNumStd 0 0.0
ClaimNumMean 0 0.0
TotalClaim 0 0.0
DeductibleStd 0 0.0
DeductibleMean 0 0.0
TotalDeductible 0 0.0
InStd 0 0.0
InMean 0 0.0
TotalInpatients 0 0.0
InscStd 0 0.0
InscMean 0 0.0
TotalInsc 0 0.0
OperatingPhysician 0 0.0
OtherPhysician 0 0.0
OutStd 0 0.0
OutMean 0 0.0
TotalOutpatients 0 0.0
PotentialFraud 0 0.0

EDA

In [0]:
def fraud_plot(df, col, title):
    fig, ax = plt.subplots(3, figsize = (6, 18))
    
    sns.distplot(np.log(df[col] + 1), ax = ax[0]).set_title('Distribution Plot')
    
    sns.distplot(np.log(df.loc[df.PotentialFraud == 0, col] + 1), hist = False, color = 'b', label = 'No Fraud', kde_kws={'shade': True}, ax = ax[1])
    sns.distplot(np.log(df.loc[df.PotentialFraud == 1, col] + 1), hist = False, color = 'r', label = 'Fraud', kde_kws={'shade': True}, ax = ax[1]).set_title('Comparison Distribution Plot')
    
    sns.boxplot(x = df.PotentialFraud, y = np.log(df[col] + 1), ax = ax[2]).set_title('Box Plot')
    
    plt.suptitle(title, fontsize = 15)
    
    plt.show()

AttendingPhysician

In [0]:
fraud_plot(df, 'AttendingPhysician', 'Number of Attending Physicians')

Inpatient Days

In [0]:
fraud_plot(df, 'InDaysStd', 'Standard Deviation of Inpatient Days')

Number of Patients

In [0]:
fraud_plot(df, 'UniBeneStd', 'Standard Deviation of Monthly Number of Unique Patients')

ClaimDays

In [0]:
fraud_plot(df, 'ClaimDaysStd', 'Standard Deviation of Claims Days')

ClaimNumber

In [0]:
fraud_plot(df, 'ClaimNumStd', 'Standard Deviation of Monthly Number of Claims')

Deductible

In [0]:
fraud_plot(df, 'DeductibleStd', 'Standard Deviation of Average Monthly Deductible')

Number of Inpatients

In [0]:
fraud_plot(df, 'InStd', 'Standard Deviation of Average Monthly Inpatients')

Insurance Paid Amount

In [0]:
fraud_plot(df, 'InscStd', 'Standard Deviation of Average Monthly Insurance Paid Amount')

OperatingPhysician

In [0]:
fraud_plot(df, 'OperatingPhysician', 'Number of Operating Physicians')

OtherPhysician

In [0]:
fraud_plot(df, 'OtherPhysician', 'Number of Other Physicians')

Outpatients

In [0]:
fraud_plot(df, 'OutStd', 'Standard Deviation of Average Monthly Number of Outpatients')
In [0]:
fig, ax = plt.subplots(figsize=(20, 20))

corr = df.corr()
sns.heatmap(corr, mask = np.zeros_like(corr, dtype = np.bool), cmap = sns.diverging_palette(220, 10, as_cmap = True),
            square = True, annot = True)

ax.set_ylim(len(corr)+0.5, -0.5)

plt.show()
In [0]:
df.to_csv('claims1.csv')

Codes EDA

In [173]:
# load the package
from datetime import date
import numpy as np
import pandas as pd
import seaborn as sns

import matplotlib.pyplot as plt


plt.rcParams['figure.figsize'] = (8, 6)
In [174]:
# load the data
inpatient = pd.read_csv('Train_Inpatientdata-1542865627584.csv')
outpatient = pd.read_csv('Train_Outpatientdata-1542865627584.csv')
fraud = pd.read_csv('Train-1542865627584.csv', index_col = 'Provider')
In [175]:
inpatient = inpatient[['ClaimID','DiagnosisGroupCode', 'ClmAdmitDiagnosisCode', 'ClmDiagnosisCode_1',
       'ClmDiagnosisCode_10', 'ClmDiagnosisCode_2', 'ClmDiagnosisCode_3',
       'ClmDiagnosisCode_4', 'ClmDiagnosisCode_5', 'ClmDiagnosisCode_6',
       'ClmDiagnosisCode_7', 'ClmDiagnosisCode_8', 'ClmDiagnosisCode_9',  
       'ClmProcedureCode_1', 'ClmProcedureCode_2', 'ClmProcedureCode_3',
       'ClmProcedureCode_4', 'ClmProcedureCode_5', 'ClmProcedureCode_6','Provider',
                        'ClaimStartDt', 'ClaimEndDt']]

outpatient = outpatient[['ClaimID','ClmAdmitDiagnosisCode', 'ClmDiagnosisCode_1',
       'ClmDiagnosisCode_10', 'ClmDiagnosisCode_2', 'ClmDiagnosisCode_3',
       'ClmDiagnosisCode_4', 'ClmDiagnosisCode_5', 'ClmDiagnosisCode_6',
       'ClmDiagnosisCode_7', 'ClmDiagnosisCode_8', 'ClmDiagnosisCode_9',  
       'ClmProcedureCode_1', 'ClmProcedureCode_2', 'ClmProcedureCode_3',
       'ClmProcedureCode_4', 'ClmProcedureCode_5', 'ClmProcedureCode_6',
                         'Provider', 'ClaimStartDt', 'ClaimEndDt']]
In [176]:
inpatient.shape
Out[176]:
(40474, 22)
In [177]:
outpatient.shape
Out[177]:
(517737, 21)
In [178]:
# map 'No' to 0 and 'Yes' to 1
fraud_map = {'No': 0, 'Yes': 1}
fraud.PotentialFraud = fraud.PotentialFraud.map(fraud_map)
In [179]:
diagnosis = ['ClmDiagnosisCode_1', 'ClmDiagnosisCode_2', 'ClmDiagnosisCode_3',
       'ClmDiagnosisCode_4', 'ClmDiagnosisCode_5', 'ClmDiagnosisCode_6',
       'ClmDiagnosisCode_7', 'ClmDiagnosisCode_8', 'ClmDiagnosisCode_9',
       'ClmDiagnosisCode_10']
procedure = ['ClmProcedureCode_1', 'ClmProcedureCode_2', 'ClmProcedureCode_3',
       'ClmProcedureCode_4', 'ClmProcedureCode_5', 'ClmProcedureCode_6']
In [180]:
diagnosisP = ['Provider','ClmDiagnosisCode_1', 'ClmDiagnosisCode_2', 'ClmDiagnosisCode_3',
       'ClmDiagnosisCode_4', 'ClmDiagnosisCode_5', 'ClmDiagnosisCode_6',
       'ClmDiagnosisCode_7', 'ClmDiagnosisCode_8', 'ClmDiagnosisCode_9',
       'ClmDiagnosisCode_10']
procedureP = ['Provider','ClmProcedureCode_1', 'ClmProcedureCode_2', 'ClmProcedureCode_3',
       'ClmProcedureCode_4', 'ClmProcedureCode_5', 'ClmProcedureCode_6']

Merging

In [181]:
# merging inpatient and outpatient
inpatient['In'] = 1
outpatient['Out'] = 1

claims = inpatient.append(outpatient)
In [182]:
# claims and patient and potential fraud
In [183]:
claims.shape
Out[183]:
(558211, 25)
In [184]:
claims.head()
Out[184]:
ClaimEndDt ClaimID ClaimStartDt ClmAdmitDiagnosisCode ClmDiagnosisCode_1 ClmDiagnosisCode_10 ClmDiagnosisCode_2 ClmDiagnosisCode_3 ClmDiagnosisCode_4 ClmDiagnosisCode_5 ... ClmProcedureCode_2 ClmProcedureCode_3 ClmProcedureCode_4 ClmProcedureCode_5 ClmProcedureCode_6 DiagnosisGroupCode In Out Provider PotentialFraud
0 2009-04-18 CLM46614 2009-04-12 7866 1970 NaN 4019 5853 7843 2768 ... NaN NaN NaN NaN NaN 201 1.0 NaN PRV55912 1
1 2009-09-02 CLM66048 2009-08-31 6186 6186 NaN 2948 56400 NaN NaN ... NaN NaN NaN NaN NaN 750 1.0 NaN PRV55907 0
2 2009-09-20 CLM68358 2009-09-17 29590 29623 NaN 30390 71690 34590 V1581 ... NaN NaN NaN NaN NaN 883 1.0 NaN PRV56046 0
3 2009-02-22 CLM38412 2009-02-14 431 43491 NaN 2762 7843 32723 V1041 ... NaN NaN NaN NaN NaN 067 1.0 NaN PRV52405 0
4 2009-08-30 CLM63689 2009-08-13 78321 042 NaN 3051 34400 5856 42732 ... NaN NaN NaN NaN NaN 975 1.0 NaN PRV56614 0

5 rows × 25 columns

In [185]:
claims.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 558211 entries, 0 to 558210
Data columns (total 25 columns):
ClaimEndDt               558211 non-null object
ClaimID                  558211 non-null object
ClaimStartDt             558211 non-null object
ClmAdmitDiagnosisCode    145899 non-null object
ClmDiagnosisCode_1       547758 non-null object
ClmDiagnosisCode_10      5010 non-null object
ClmDiagnosisCode_2       362605 non-null object
ClmDiagnosisCode_3       243055 non-null object
ClmDiagnosisCode_4       164536 non-null object
ClmDiagnosisCode_5       111924 non-null object
ClmDiagnosisCode_6       84392 non-null object
ClmDiagnosisCode_7       66177 non-null object
ClmDiagnosisCode_8       53444 non-null object
ClmDiagnosisCode_9       41815 non-null object
ClmProcedureCode_1       23310 non-null float64
ClmProcedureCode_2       5490 non-null float64
ClmProcedureCode_3       969 non-null float64
ClmProcedureCode_4       118 non-null float64
ClmProcedureCode_5       9 non-null float64
ClmProcedureCode_6       0 non-null float64
DiagnosisGroupCode       40474 non-null object
In                       40474 non-null float64
Out                      517737 non-null float64
Provider                 558211 non-null object
PotentialFraud           558211 non-null int64
dtypes: float64(8), int64(1), object(16)
memory usage: 110.7+ MB
In [186]:
claims['Admit_Diagnosis_EVCodes'] = claims['ClmAdmitDiagnosisCode'].str.contains("V|E", na=False)
In [187]:
true_false = {False: 0, True: 1}
claims.Admit_Diagnosis_EVCodes = claims.Admit_Diagnosis_EVCodes.map(true_false)
In [188]:
claims['DiagnosisGroupCode'] = claims['DiagnosisGroupCode'].replace('OTH', np.nan)
In [189]:
#claims['DiagnosisGroupCode'].sort_values().unique()
In [190]:
claims = claims.astype({'DiagnosisGroupCode': 'float'})
In [191]:
claims['DiagnosisGroupCode'].describe()
Out[191]:
count    40361.000000
mean       431.796189
std        263.703078
min          0.000000
25%        222.000000
50%        352.000000
75%        630.000000
max        999.000000
Name: DiagnosisGroupCode, dtype: float64
In [192]:
claims['DiagnosisGroupCode'].head()
Out[192]:
0    201.0
1    750.0
2    883.0
3     67.0
4    975.0
Name: DiagnosisGroupCode, dtype: float64
In [193]:
claims.ClaimStartDt = pd.to_datetime(claims.ClaimStartDt)
claims.ClaimEndDt = pd.to_datetime(claims.ClaimEndDt)
In [194]:
claims['diagnosis_count'] = claims[diagnosis].count(axis='columns')
claims['procedure_count'] = claims[procedure].count(axis='columns')
In [195]:
claims['Provider'].nunique()
Out[195]:
5410
In [196]:
claims.head()
Out[196]:
ClaimEndDt ClaimID ClaimStartDt ClmAdmitDiagnosisCode ClmDiagnosisCode_1 ClmDiagnosisCode_10 ClmDiagnosisCode_2 ClmDiagnosisCode_3 ClmDiagnosisCode_4 ClmDiagnosisCode_5 ... ClmProcedureCode_5 ClmProcedureCode_6 DiagnosisGroupCode In Out Provider PotentialFraud Admit_Diagnosis_EVCodes diagnosis_count procedure_count
0 2009-04-18 CLM46614 2009-04-12 7866 1970 NaN 4019 5853 7843 2768 ... NaN NaN 201.0 1.0 NaN PRV55912 1 0 9 0
1 2009-09-02 CLM66048 2009-08-31 6186 6186 NaN 2948 56400 NaN NaN ... NaN NaN 750.0 1.0 NaN PRV55907 0 0 3 1
2 2009-09-20 CLM68358 2009-09-17 29590 29623 NaN 30390 71690 34590 V1581 ... NaN NaN 883.0 1.0 NaN PRV56046 0 0 6 0
3 2009-02-22 CLM38412 2009-02-14 431 43491 NaN 2762 7843 32723 V1041 ... NaN NaN 67.0 1.0 NaN PRV52405 0 0 9 1
4 2009-08-30 CLM63689 2009-08-13 78321 042 NaN 3051 34400 5856 42732 ... NaN NaN 975.0 1.0 NaN PRV56614 0 0 9 1

5 rows × 28 columns

Group By Provider

In [197]:
new_claims = claims[['Provider','ClmAdmitDiagnosisCode']]
#new_claims.head()
#new_claims.set_index('Provider', inplace=True)
#new_claims = pd.concat([new_claims[col] for col in new_claims])
#new_claims = new_claims.to_frame().dropna().reset_index()
unique_admitcode = new_claims.groupby('Provider')['ClmAdmitDiagnosisCode'].nunique().to_frame().reset_index().rename(columns={'ClmAdmitDiagnosisCode': "unique_admitcode"})
#unique_diagnosis = new_claims.groupby('Provider')[0].nunique()
#unique_diagnosis = unique_diagnosis.to_frame().reset_index().rename(columns={0: "unique_diagnosis"})
unique_admitcode.head()
Out[197]:
Provider unique_admitcode
0 PRV51001 11
1 PRV51003 58
2 PRV51004 25
3 PRV51005 158
4 PRV51007 17
In [198]:
new_claims = claims[['Provider','DiagnosisGroupCode']]
#new_claims.head()
#new_claims.set_index('Provider', inplace=True)
#new_claims = pd.concat([new_claims[col] for col in new_claims])
#new_claims = new_claims.to_frame().dropna().reset_index()
unique_DRG = new_claims.groupby('Provider')['DiagnosisGroupCode'].nunique().to_frame().reset_index().rename(columns={'DiagnosisGroupCode': "unique_DRG"})
#unique_diagnosis = new_claims.groupby('Provider')[0].nunique()
#unique_diagnosis = unique_diagnosis.to_frame().reset_index().rename(columns={0: "unique_diagnosis"})
unique_DRG.head()
Out[198]:
Provider unique_DRG
0 PRV51001 5
1 PRV51003 58
2 PRV51004 0
3 PRV51005 0
4 PRV51007 3
In [199]:
new_claims = claims[diagnosisP]
new_claims.set_index('Provider', inplace=True)
new_claims = pd.concat([new_claims[col] for col in new_claims])
new_claims = new_claims.to_frame().dropna().reset_index()
#new_claims.groupby('Provider')['0'].nunique()
unique_diagnosis = new_claims.groupby('Provider')[0].nunique().to_frame().reset_index().rename(columns={0: "unique_diagnosis"})
#fraud_diagnoses = pd.Series(diagnosis_df.to_numpy().flatten()).dropna()
In [200]:
unique_diagnosis.head()
Out[200]:
Provider unique_diagnosis
0 PRV51001 72
1 PRV51003 365
2 PRV51004 267
3 PRV51005 1294
4 PRV51007 165
In [201]:
unique_diagnosis.shape
Out[201]:
(5405, 2)
In [202]:
new_claims = claims.loc[claims.In == 1, diagnosisP]
#new_claims = claims[diagnosisP]
new_claims.set_index('Provider', inplace=True)
new_claims = pd.concat([new_claims[col] for col in new_claims])
new_claims = new_claims.to_frame().dropna().reset_index()
unique_diagnosis_In = new_claims.groupby('Provider')[0].nunique()
unique_diagnosis_In = unique_diagnosis_In.to_frame().reset_index().rename(columns={0: "unique_diagnosis_In"})
In [203]:
unique_diagnosis_In.head()
Out[203]:
Provider unique_diagnosis_In
0 PRV51001 34
1 PRV51003 271
2 PRV51007 22
3 PRV51008 15
4 PRV51011 8
In [204]:
new_claims = claims.loc[claims.Out == 1, diagnosisP]
#new_claims = claims[diagnosisP]
new_claims.set_index('Provider', inplace=True)
new_claims = pd.concat([new_claims[col] for col in new_claims])
new_claims = new_claims.to_frame().dropna().reset_index()
unique_diagnosis_Out = new_claims.groupby('Provider')[0].nunique()
unique_diagnosis_Out = unique_diagnosis_Out.to_frame().reset_index().rename(columns={0: "unique_diagnosis_Out"})
In [205]:
unique_diagnosis_Out.head()
Out[205]:
Provider unique_diagnosis_Out
0 PRV51001 41
1 PRV51003 137
2 PRV51004 267
3 PRV51005 1294
4 PRV51007 153
In [206]:
new_claims = claims[procedureP]
new_claims.set_index('Provider', inplace=True)
new_claims = pd.concat([new_claims[col] for col in new_claims])
new_claims = new_claims.to_frame().dropna().reset_index()
#new_claims.groupby('Provider')['0'].nunique()
unique_procedure = new_claims.groupby('Provider')[0].nunique()
unique_procedure = unique_procedure.to_frame().reset_index().rename(columns={0: "unique_procedure"})
#fraud_diagnoses = pd.Series(diagnosis_df.to_numpy().flatten()).dropna()
In [207]:
unique_procedure.head()
Out[207]:
Provider unique_procedure
0 PRV51001 3
1 PRV51003 39
2 PRV51007 1
3 PRV51008 2
4 PRV51017 2
In [208]:
new_claims = claims.loc[claims.In == 1, procedureP]
#new_claims = claims[diagnosisP]
new_claims.set_index('Provider', inplace=True)
new_claims = pd.concat([new_claims[col] for col in new_claims])
new_claims = new_claims.to_frame().dropna().reset_index()
unique_procedure_In = new_claims.groupby('Provider')[0].nunique()
unique_procedure_In = unique_procedure_In.to_frame().reset_index().rename(columns={0: "unique_procedure_In"})
In [209]:
unique_procedure_In.head()
Out[209]:
Provider unique_procedure_In
0 PRV51001 3
1 PRV51003 39
2 PRV51007 1
3 PRV51008 2
4 PRV51021 18
In [210]:
new_claims = claims.loc[claims.Out == 1, procedureP]
#new_claims = claims[diagnosisP]
new_claims.set_index('Provider', inplace=True)
new_claims = pd.concat([new_claims[col] for col in new_claims])
new_claims = new_claims.to_frame().dropna().reset_index()
unique_procedure_Out = new_claims.groupby('Provider')[0].nunique()
unique_procedure_Out = unique_procedure_Out.to_frame().reset_index().rename(columns={0: "unique_procedure_Out"})
In [211]:
unique_procedure_Out.head()
Out[211]:
Provider unique_procedure_Out
0 PRV51017 2
1 PRV51113 1
2 PRV51119 2
3 PRV51244 2
4 PRV51265 1
In [212]:
def groupby_provider(col, func, freq = 'M'):
    temp = claims[['ClaimStartDt', 'Provider', col]]
    temp.set_index('ClaimStartDt', inplace = True)

    group = pd.DataFrame(temp.groupby([pd.Grouper(freq='M'), 'Provider']).agg(func))
    group.reset_index(inplace = True)
    group = group.pivot(index = 'Provider', columns = 'ClaimStartDt', values = col)
    group.columns = group.columns.strftime('%Y-%m-%d')
    return group

Diagnosis

In [213]:
# average number of inpatient days per month
diagnosis_count = groupby_provider('diagnosis_count', 'mean')
diagnosis_count = diagnosis_count.add_prefix('Avg')
diagnosis_count.fillna(0, inplace = True)
diagnosis_count.head()
Out[213]:
Avg2008-11-30 Avg2008-12-31 Avg2009-01-31 Avg2009-02-28 Avg2009-03-31 Avg2009-04-30 Avg2009-05-31 Avg2009-06-30 Avg2009-07-31 Avg2009-08-31 Avg2009-09-30 Avg2009-10-31 Avg2009-11-30 Avg2009-12-31
Provider
PRV51001 0.0 0.0 1.500000 3.750000 3.000000 1.500000 5.800000 2.333333 4.500000 2.000000 0.000000 0.000000 0.000000 1.500000
PRV51003 0.0 7.0 5.000000 4.937500 4.600000 5.400000 5.875000 4.428571 6.454545 5.846154 6.111111 4.727273 5.090909 4.600000
PRV51004 0.0 0.0 2.000000 2.000000 2.888889 2.600000 2.250000 3.181818 2.642857 2.100000 2.416667 3.454545 2.500000 2.937500
PRV51005 0.0 3.5 2.941176 2.445545 2.522124 2.653061 2.554217 2.242718 2.565217 2.969697 2.626168 2.477477 2.657534 2.395062
PRV51007 0.0 0.0 2.166667 3.400000 2.444444 1.250000 3.333333 4.333333 2.333333 3.666667 3.571429 1.500000 2.166667 3.166667
In [214]:
diagnosis_count_Std = pd.DataFrame(diagnosis_count.std(axis = 1), columns = ['Diagnosis_Count_Std'])
diagnosis_count_Std.head()
Out[214]:
Diagnosis_Count_Std
Provider
PRV51001 1.866580
PRV51003 1.634357
PRV51004 1.031048
PRV51005 0.774761
PRV51007 1.328274
In [215]:
diagnosis_count_mean = pd.DataFrame(diagnosis_count.mean(axis = 1), columns = ['Diagnosis_Count_Mean'])
diagnosis_count_mean.head()
Out[215]:
Diagnosis_Count_Mean
Provider
PRV51001 1.848810
PRV51003 5.005076
PRV51004 2.212305
PRV51005 2.467857
PRV51007 2.380896

Procedure

In [217]:
# average number of Admit code permonth
procedure_count = groupby_provider('procedure_count', 'mean')
procedure_count = procedure_count.add_prefix('InDays')
procedure_count.fillna(0, inplace = True)
procedure_count.head()
Out[217]:
InDays2008-11-30 InDays2008-12-31 InDays2009-01-31 InDays2009-02-28 InDays2009-03-31 InDays2009-04-30 InDays2009-05-31 InDays2009-06-30 InDays2009-07-31 InDays2009-08-31 InDays2009-09-30 InDays2009-10-31 InDays2009-11-30 InDays2009-12-31
Provider
PRV51001 0.0 0.0 0.000000 0.2500 0.0 0.0 0.400000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0
PRV51003 0.0 0.0 0.461538 0.3125 0.3 0.6 0.375000 0.214286 0.545455 0.076923 0.555556 0.454545 0.454545 0.0
PRV51004 0.0 0.0 0.000000 0.0000 0.0 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0
PRV51005 0.0 0.0 0.000000 0.0000 0.0 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0
PRV51007 0.0 0.0 0.000000 0.0000 0.0 0.0 0.111111 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0
In [218]:
procedure_count_Std = pd.DataFrame(procedure_count.std(axis = 1), columns = ['procedure_count_Std'])
procedure_count_Std.head()
Out[218]:
procedure_count_Std
Provider
PRV51001 0.121630
PRV51003 0.218508
PRV51004 0.000000
PRV51005 0.000000
PRV51007 0.029696
In [219]:
procedure_count_mean = pd.DataFrame(procedure_count.mean(axis = 1), columns = ['procedure_count_Mean'])
procedure_count_mean.head()
Out[219]:
procedure_count_Mean
Provider
PRV51001 0.046429
PRV51003 0.310739
PRV51004 0.000000
PRV51005 0.000000
PRV51007 0.007937

Admit

In [220]:
# average number of inpatient days per month
admit_unique = groupby_provider('ClmAdmitDiagnosisCode', pd.Series.nunique)
admit_unique = admit_unique.add_prefix('InDays')
admit_unique.fillna(0, inplace = True)
admit_unique.head()
Out[220]:
InDays2008-11-30 InDays2008-12-31 InDays2009-01-31 InDays2009-02-28 InDays2009-03-31 InDays2009-04-30 InDays2009-05-31 InDays2009-06-30 InDays2009-07-31 InDays2009-08-31 InDays2009-09-30 InDays2009-10-31 InDays2009-11-30 InDays2009-12-31
Provider
PRV51001 0.0 0.0 0.0 2.0 1.0 0.0 3.0 1.0 2.0 0.0 1.0 0.0 0.0 1.0
PRV51003 0.0 1.0 11.0 8.0 6.0 8.0 4.0 7.0 7.0 5.0 5.0 5.0 7.0 1.0
PRV51004 0.0 0.0 4.0 1.0 5.0 3.0 0.0 4.0 5.0 0.0 2.0 1.0 1.0 2.0
PRV51005 0.0 0.0 30.0 31.0 32.0 19.0 22.0 20.0 17.0 16.0 15.0 18.0 6.0 7.0
PRV51007 0.0 0.0 2.0 1.0 4.0 1.0 3.0 2.0 1.0 2.0 1.0 0.0 0.0 0.0
In [221]:
admit_unique_Std = pd.DataFrame(admit_unique.std(axis = 1), columns = ['Admit_unique_Std'])
admit_unique_Std.head()
Out[221]:
Admit_unique_Std
Provider
PRV51001 0.974961
PRV51003 3.078640
PRV51004 1.881080
PRV51005 10.492541
PRV51007 1.251373
In [222]:
admit_unique_mean = pd.DataFrame(admit_unique.mean(axis = 1), columns = ['Admit_unique_Mean'])
admit_unique_mean.head()
Out[222]:
Admit_unique_Mean
Provider
PRV51001 0.785714
PRV51003 5.357143
PRV51004 2.000000
PRV51005 16.642857
PRV51007 1.214286

DRG Code

In [223]:
# average number of inpatient days per month
DRG_unique = groupby_provider('DiagnosisGroupCode', pd.Series.nunique)
DRG_unique = DRG_unique.add_prefix('InDays')
DRG_unique.fillna(0, inplace = True)
DRG_unique.head()
Out[223]:
InDays2008-11-30 InDays2008-12-31 InDays2009-01-31 InDays2009-02-28 InDays2009-03-31 InDays2009-04-30 InDays2009-05-31 InDays2009-06-30 InDays2009-07-31 InDays2009-08-31 InDays2009-09-30 InDays2009-10-31 InDays2009-11-30 InDays2009-12-31
Provider
PRV51001 0.0 0.0 0.0 2.0 0.0 0.0 2.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0
PRV51003 0.0 1.0 6.0 9.0 4.0 6.0 4.0 5.0 6.0 5.0 5.0 5.0 5.0 1.0
PRV51004 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
PRV51005 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
PRV51007 0.0 0.0 0.0 0.0 1.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0
In [224]:
DRG_unique_Std = pd.DataFrame(DRG_unique.std(axis = 1), columns = ['DRG_unique_Std'])
DRG_unique_Std.head()
Out[224]:
DRG_unique_Std
Provider
PRV51001 0.744946
PRV51003 2.376626
PRV51004 0.000000
PRV51005 0.000000
PRV51007 0.425815
In [225]:
DRG_unique_mean = pd.DataFrame(DRG_unique.mean(axis = 1), columns = ['DRG_unique_Mean'])
DRG_unique_mean.head()
Out[225]:
DRG_unique_Mean
Provider
PRV51001 0.357143
PRV51003 4.428571
PRV51004 0.000000
PRV51005 0.000000
PRV51007 0.214286

Merge Providers

In [226]:
#merge(unique_diagnosis, unique_diagnosis_In, unique_diagnosis_Out, 
#unique_procedure, unique_procedure_Out, unique_procedure_In,
#diagnosis_count_Std, diagnosis_count_mean,
#procedure_count_Std, procedure_count_mean)


Providers = unique_diagnosis.merge(
    unique_diagnosis_In, 
    on = 'Provider' , 
    how='outer').fillna(0).merge(
    unique_diagnosis_Out, 
    on = "Provider",
    how='outer').fillna(0).merge(
    unique_procedure, 
    on = "Provider",
    how='outer').fillna(0).merge(
    unique_procedure_In, 
    on = "Provider",
    how='outer').fillna(0).merge(
    unique_procedure_Out, 
    on = "Provider",
    how='outer').fillna(0).merge(
    diagnosis_count_Std, 
    on = "Provider",
    how='outer').fillna(0).merge(
    diagnosis_count_mean, 
    on = "Provider",
    how='outer').fillna(0).merge(
    procedure_count_Std, 
    on = "Provider",
    how='outer').fillna(0).merge(
    procedure_count_mean, 
    on = "Provider",
    how='outer').fillna(0).merge(
    unique_admitcode, 
    on = "Provider",
    how='outer').fillna(0).merge(
    unique_DRG, 
    on = "Provider",
    how='outer').fillna(0).merge(
    admit_unique_Std, 
    on = "Provider",
    how='outer').fillna(0).merge(
    admit_unique_mean, 
    on = "Provider",
    how='outer').fillna(0).merge(
    DRG_unique_Std, 
    on = "Provider",
    how='outer').fillna(0).merge(
    DRG_unique_mean, 
    on = "Provider",
    how='outer').fillna(0)
In [227]:
Providers.sort_values('unique_diagnosis').head(5)
Out[227]:
Provider unique_diagnosis unique_diagnosis_In unique_diagnosis_Out unique_procedure unique_procedure_In unique_procedure_Out Diagnosis_Count_Std Diagnosis_Count_Mean procedure_count_Std procedure_count_Mean unique_admitcode unique_DRG Admit_unique_Std Admit_unique_Mean DRG_unique_Std DRG_unique_Mean
5409 PRV57461 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0 0.0 0.0 0.0 0.0
5405 PRV51722 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0 0.0 0.0 0.0 0.0
5408 PRV55881 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0 0.0 0.0 0.0 0.0
5407 PRV55802 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0 0.0 0.0 0.0 0.0
5406 PRV52757 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0 0.0 0.0 0.0 0.0
In [229]:
Providers.shape
Out[229]:
(5410, 17)
In [230]:
Providers.to_csv('Codes.csv') 

Combining Providers

In [ ]:
 

Admit Diagnosis

In [19]:
# top 10 diagnoses: Admit
diagnosis_df = claims['ClmAdmitDiagnosisCode']
fraud_diagnoses = pd.Series(diagnosis_df.to_numpy().flatten()).dropna()

fig = plt.figure(figsize = (12, 6))
sns.countplot(x = fraud_diagnoses, order = fraud_diagnoses.value_counts().index[:20])
plt.xlabel('ICD9 Code')
plt.title('Top Admit Diagnosis Code')
plt.show()
In [20]:
df = pd.concat([claims['ClmAdmitDiagnosisCode'].value_counts(), 
                claims['ClmAdmitDiagnosisCode'].value_counts(normalize=True).mul(100)],axis=1, keys=('counts','percentage'))
In [21]:
df['percentage_running_total'] = df['percentage'].cumsum()
In [22]:
df = df.reset_index()
df['number'] = np.arange(len(df))
In [23]:
df.plot(x='number', y='percentage_running_total', kind='line', 
        figsize=(10, 8), legend=False, style='mo-')
Out[23]:
<matplotlib.axes._subplots.AxesSubplot at 0x1a243e5b90>
In [24]:
# top 10 diagnoses involved with fraud
fraud_diagnosis_df =  claims.loc[claims.PotentialFraud == 1, 'ClmAdmitDiagnosisCode']
fraud_diagnoses = pd.Series(fraud_diagnosis_df.to_numpy().flatten()).dropna()

fig = plt.figure(figsize = (12, 6))
sns.countplot(x = fraud_diagnoses, order = fraud_diagnoses.value_counts().index[:10], palette = 'RdBu')
plt.xlabel('ICD9 Code')
plt.title('Top 10 Admit Diagnoses Involved with Potential Fraud')
plt.show()
In [25]:
fraud_diagnoses.unique().shape
Out[25]:
(3146,)

Claim Diagnosis

In [26]:
# top 10 diagnoses: Claim
diagnosis_df = claims[diagnosis]
fraud_diagnoses = pd.Series(diagnosis_df.to_numpy().flatten()).dropna()

fig = plt.figure(figsize = (12, 6))
sns.countplot(x = fraud_diagnoses, order = fraud_diagnoses.value_counts().index[:20])
plt.xlabel('ICD9 Code')
plt.title('Top Claim Diagnosis Code')
plt.show()
In [27]:
df = pd.concat([fraud_diagnoses.value_counts(), 
                fraud_diagnoses.value_counts(normalize=True).mul(100)],axis=1, keys=('counts','percentage'))
In [28]:
df['percentage_running_total'] = df['percentage'].cumsum()
In [29]:
df = df.reset_index()
df['number'] = np.arange(len(df))
In [30]:
df.plot(x='number', y='percentage_running_total', kind='line', 
        figsize=(10, 8), legend=False, style='mo-')
Out[30]:
<matplotlib.axes._subplots.AxesSubplot at 0x1a2259d6d0>
In [31]:
# top 10 diagnoses involved with fraud
fraud_diagnosis_df = claims.loc[claims.PotentialFraud == 1, diagnosis]
fraud_diagnoses = pd.Series(fraud_diagnosis_df.to_numpy().flatten()).dropna()

fig = plt.figure(figsize = (12, 6))
sns.countplot(x = fraud_diagnoses, order = fraud_diagnoses.value_counts().index[:10], palette = 'RdBu')
plt.xlabel('ICD9 Code')
plt.title('Top 10 Diagnoses Involved with Potential Fraud')
plt.show()
In [32]:
fraud_diagnoses.unique().shape
Out[32]:
(9766,)

Diagnosis Group

In [33]:
# top 10 diagnoses: Claim
diagnosis_df = claims['DiagnosisGroupCode']
fraud_diagnoses = pd.Series(diagnosis_df.to_numpy().flatten()).dropna()

fig = plt.figure(figsize = (12, 6))
sns.countplot(x = fraud_diagnoses, order = fraud_diagnoses.value_counts().index[:20])
plt.xlabel('DRG Code')
plt.title('Top Claim Diagnosis Code')
plt.show()
In [34]:
df = pd.concat([claims['DiagnosisGroupCode'].value_counts(), 
                claims['DiagnosisGroupCode'].value_counts(normalize=True).mul(100)],axis=1, keys=('counts','percentage'))
In [35]:
df['percentage_running_total'] = df['percentage'].cumsum()
In [36]:
df = df.reset_index()
df['number'] = np.arange(len(df))
In [37]:
df.plot(x='number', y='percentage_running_total', kind='line', 
        figsize=(10, 8), legend=False, style='mo-')
Out[37]:
<matplotlib.axes._subplots.AxesSubplot at 0x1a1b48ad90>
In [38]:
# top 10 diagnoses involved with fraud
fraud_diagnosis_df = claims.loc[claims.PotentialFraud == 1,'DiagnosisGroupCode']
fraud_diagnoses = pd.Series(fraud_diagnosis_df.to_numpy().flatten()).dropna()

fig = plt.figure(figsize = (12, 6))
sns.countplot(x = fraud_diagnoses, order = fraud_diagnoses.value_counts().index[:10], palette = 'RdBu')
plt.xlabel('DRG Code')
plt.title('Top 10 Diagnosis Group Code Involved with Potential Fraud')
plt.show()
In [39]:
fraud_diagnoses.unique().shape
Out[39]:
(732,)

Procedure Code

In [40]:
# top 10 diagnoses: Claim
diagnosis_df = claims[procedure]
fraud_diagnoses = pd.Series(diagnosis_df.to_numpy().flatten()).dropna()

fig = plt.figure(figsize = (12, 6))
sns.countplot(x = fraud_diagnoses, order = fraud_diagnoses.value_counts().index[:20])
plt.xlabel('CPT Code')
plt.title('Top Procedure Code')
plt.show()
In [41]:
df = pd.concat([fraud_diagnoses.value_counts(), 
                fraud_diagnoses.value_counts(normalize=True).mul(100)],axis=1, keys=('counts','percentage'))
In [42]:
df['percentage_running_total'] = df['percentage'].cumsum()
In [43]:
df = df.reset_index()
df['number'] = np.arange(len(df))
In [44]:
df.plot(x='number', y='percentage_running_total', kind='line', 
        figsize=(10, 8), legend=False, style='mo-')
Out[44]:
<matplotlib.axes._subplots.AxesSubplot at 0x1a25ebb9d0>
In [45]:
# top 10 diagnoses involved with fraud
fraud_diagnosis_df = claims.loc[claims.PotentialFraud == 1, procedure]
fraud_diagnoses = pd.Series(fraud_diagnosis_df.to_numpy().flatten()).dropna()

fig = plt.figure(figsize = (12, 6))
sns.countplot(x = fraud_diagnoses, order = fraud_diagnoses.value_counts().index[:10], palette = 'RdBu')
plt.xlabel('CPT Code')
plt.title('Top 10 Procedure Code Involved with Potential Fraud')
plt.show()

Modeling

In [30]:
# Load the packages
import numpy as np
import pandas as pd
import math
from scipy import stats
import time
from itertools import cycle
import matplotlib.pyplot as plt
import seaborn as sns

from imblearn.pipeline import Pipeline 
from imblearn.over_sampling import ADASYN

from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import StratifiedKFold
from sklearn.model_selection import RandomizedSearchCV
from sklearn.pipeline import make_pipeline

from sklearn.cluster import KMeans
from sklearn.neighbors import NearestNeighbors
from sklearn.cluster import DBSCAN

from sklearn.naive_bayes import GaussianNB
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from xgboost.sklearn import XGBClassifier

from pyod.utils.data import evaluate_print
from pyod.utils.example import visualize
from pyod.models.abod import ABOD
from pyod.models.iforest import IForest
from pyod.models.lof import LOF
from pyod.models.pca import PCA

from sklearn.metrics import roc_auc_score, f1_score, precision_score, recall_score, classification_report, precision_recall_curve
from sklearn.metrics import plot_precision_recall_curve

sns.set()
%matplotlib inline
import warnings
warnings.filterwarnings('ignore')

SEED = 42
In [4]:
# # load the data
# demo = pd.read_csv('demo_agg.csv', index_col = 0)
# claim = pd.read_csv('claims1.csv')
# code = pd.read_csv('Codes.csv', index_col = 0)
In [5]:
# print(demo.shape)
# print(claim.shape)
# print(code.shape)
In [6]:
# df.columns
In [7]:
# # merge
# claim.drop('PotentialFraud', axis = 1, inplace = True)

# df = claim.merge(demo, how = 'left', on = 'Provider')
# df = df.merge(code, how = 'left', on = 'Provider')
# df.shape
In [8]:
# df.columns
In [9]:
# df.to_csv('merge.csv', index = False)
In [10]:
# load the data
df = pd.read_csv('merge.csv')
In [11]:
# set provider as index
df.set_index('Provider', inplace = True)
In [12]:
df.shape
Out[12]:
(5408, 65)
In [13]:
X = df.drop('PotentialFraud', axis = 1)
y = df.PotentialFraud
In [14]:
# check missing values
def check_missing(df):
    missing = df.isnull().sum()
    missing_percentage = (df.isnull().sum()/len(df)*100).round(2)
    missing_val = pd.concat([missing, missing_percentage], axis = 1)
    missing_val.columns = ['Missing Values', '% Missing']
    total_columns = df.shape[1]
    missing_columns = (df.isnull().sum() > 0).sum()
    print('Out of {} columns, {} columns have missing values'.format(total_columns, missing_columns))
    return missing_val

check_missing(X)
Out of 64 columns, 0 columns have missing values
Out[14]:
Missing Values % Missing
AttendingPhysician 0 0.0
AvgAge 0 0.0
InDaysStd 0 0.0
InDaysMean 0 0.0
TotalInDays 0 0.0
... ... ...
unique_DRG 0 0.0
Admit_unique_Std 0 0.0
Admit_unique_Mean 0 0.0
DRG_unique_Std 0 0.0
DRG_unique_Mean 0 0.0

64 rows × 2 columns

In [15]:
y.value_counts(normalize = True)
Out[15]:
0    0.906435
1    0.093565
Name: PotentialFraud, dtype: float64

t-SNE Visualization

In [16]:
tsne = TSNE(random_state = SEED)
Tsne_transformed = tsne.fit_transform(X)
In [17]:
sns.set_style("white")

plt.figure(figsize = (8, 6))
xs = Tsne_transformed[:,0]
ys = Tsne_transformed[:,1]
sns.scatterplot(xs, ys, hue=y, palette = 'RdBu')
plt.title('t-SNE Visualization', fontsize = 15)
plt.legend()
plt.show()

Correlation Matrix

In [18]:
corr = df.corr()

fig, ax = plt.subplots(figsize = (50, 50))
sns.heatmap(corr, annot = True, square = True)
ax.set_ylim(len(corr)+0, -0)

plt.show()
In [19]:
# features most correlated with the target variable:
fraud_corr = corr['PotentialFraud'].sort_values(ascending = False)
relevant_features = fraud_corr[:11].index.tolist()

fig, ax = plt.subplots(figsize = (10, 10))
fraud_corr_matrix = df[relevant_features].corr()
sns.heatmap(fraud_corr_matrix, annot = True, square = True)
ax.set_ylim(len(fraud_corr_matrix)+0, -0)

plt.show()

Feature Importance

In [20]:
# train test split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, stratify = y, random_state = SEED)
In [21]:
# define which resampling method and which ML model to use in the pipeline
scaler = StandardScaler()
resampling = ADASYN(random_state = SEED, sampling_strategy = 1.0)
model = RandomForestClassifier(random_state = SEED)

# define the pipeline, tell it to combine ADASYN with the Logistic Regression model
pipeline = Pipeline([('Scaler', scaler), ('ADASYN', resampling), ('Classifier', model)])

# fit the data and get the train score
pipeline = pipeline.fit(X_train, y_train)
In [22]:
# features and feature importances
sns.set()
fig = plt.figure(figsize = (16, 8))

features = X_train.columns
importances = pipeline.steps[2][1].feature_importances_
indices = np.argsort(importances)[::-1]
names = [features[i] for i in indices]

plt.title("Feature Importance", fontsize = 15)
plt.bar(range(X_train.shape[1]), importances[indices])
plt.xticks(range(X_train.shape[1]), names, rotation=90)

plt.show()

Unsupervised Anomaly Detection Model

Linear Models for Outlier Detection:

  1. PCA: Principal Component Analysis (use the sum of weighted projected distances to the eigenvector hyperplane as the outlier outlier scores)
  2. MCD: Minimum Covariance Determinant (use the mahalanobis distances as the outlier scores)
  3. OCSVM: One-Class Support Vector Machines

Proximity-Based Outlier Detection Models:

  1. LOF: Local Outlier Factor
  2. CBLOF: Clustering-Based Local Outlier Factor
  3. kNN: k Nearest Neighbors (use the distance to the kth nearest neighbor as the outlier score)
  4. Median kNN Outlier Detection (use the median distance to k nearest neighbors as the outlier score) 5.HBOS: Histogram-based Outlier Score

Probabilistic Models for Outlier Detection:

  1. ABOD: Angle-Based Outlier Detection

Outlier Ensembles and Combination Frameworks:

  1. Isolation Forest
  2. Feature Bagging
  3. LSCP
In [23]:
# Define the outliers_fraction
outliers_fraction = y.value_counts(normalize = True)[1]
clusters_separation = [0]
In [24]:
# scaling
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
In [41]:
# Define four outlier detection tools to be compared
classifiers = {
    'Angle-based Outlier Detector (ABOD)':
        ABOD(n_neighbors = 20, contamination=outliers_fraction),
    'Isolation Forest': IForest(n_estimators = 500, bootstrap = True, contamination=outliers_fraction,
                                random_state=SEED),
    'Local Outlier Factor (LOF)':
        LOF(n_neighbors = 20, contamination=outliers_fraction),
    'Principal Component Analysis (PCA)': PCA(
        contamination=outliers_fraction, random_state=SEED)
}
In [42]:
train_precision = []
train_recall = []
train_f1 = []

test_precision = []
test_recall = []
test_f1 = []

for i, (clf_name, clf) in enumerate(classifiers.items()) :
    # fit the dataset to the model
    clf.fit(X_train_scaled)
    y_train_pred = clf.labels_
    y_train_scores = clf.decision_scores_

    # predict raw anomaly score 
    y_test_scores = clf.decision_function(X_test_scaled) 

    # prediction of a datapoint category outlier or inlier
    y_test_pred = clf.predict(X_test_scaled) 

    # no of errors in prediction
    n_errors = (y_test_pred != y_test).sum()
    print('No of Errors : ', clf_name, n_errors)
    
    # classification report
    print(classification_report(y_test, y_test_pred))
    
    # precision, recall, f1
    train_precision.append(precision_score(y_train, y_train_pred))
    train_recall.append(recall_score(y_train, y_train_pred))
    train_f1.append(f1_score(y_train, y_train_pred))
    test_precision.append(precision_score(y_test, y_test_pred))
    test_recall.append(recall_score(y_test, y_test_pred))
    test_f1.append(f1_score(y_test, y_test_pred))
    
    # evaluate and print the results
    print("\nOn Training Data:")
    evaluate_print(clf_name, y_train, y_train_scores)
    print("\nOn Test Data:")
    evaluate_print(clf_name, y_test, y_test_scores)
    
    # visualize the results
    visualize(clf_name, X_train_scaled[:,[0,5]], y_train, X_test_scaled[:,[0,5]], y_test, y_train_pred,
              y_test_pred, show_figure=True, save_figure=False)
    
    print('-'*80)
No of Errors :  Angle-based Outlier Detector (ABOD) 176
              precision    recall  f1-score   support

           0       0.91      0.91      0.91       981
           1       0.16      0.18      0.17       101

    accuracy                           0.84      1082
   macro avg       0.54      0.54      0.54      1082
weighted avg       0.84      0.84      0.84      1082


On Training Data:
Angle-based Outlier Detector (ABOD) ROC:0.5669, precision @ rank n:0.0889

On Test Data:
Angle-based Outlier Detector (ABOD) ROC:0.5896, precision @ rank n:0.1683
--------------------------------------------------------------------------------
No of Errors :  Isolation Forest 88
              precision    recall  f1-score   support

           0       0.96      0.95      0.95       981
           1       0.56      0.63      0.59       101

    accuracy                           0.92      1082
   macro avg       0.76      0.79      0.77      1082
weighted avg       0.92      0.92      0.92      1082


On Training Data:
Isolation Forest ROC:0.8836, precision @ rank n:0.5062

On Test Data:
Isolation Forest ROC:0.9243, precision @ rank n:0.5842
--------------------------------------------------------------------------------
No of Errors :  Local Outlier Factor (LOF) 185
              precision    recall  f1-score   support

           0       0.91      0.91      0.91       981
           1       0.08      0.08      0.08       101

    accuracy                           0.83      1082
   macro avg       0.49      0.49      0.49      1082
weighted avg       0.83      0.83      0.83      1082


On Training Data:
Local Outlier Factor (LOF) ROC:0.3797, precision @ rank n:0.0494

On Test Data:
Local Outlier Factor (LOF) ROC:0.4001, precision @ rank n:0.0792
--------------------------------------------------------------------------------
No of Errors :  Principal Component Analysis (PCA) 105
              precision    recall  f1-score   support

           0       0.95      0.94      0.95       981
           1       0.48      0.55      0.52       101

    accuracy                           0.90      1082
   macro avg       0.72      0.75      0.73      1082
weighted avg       0.91      0.90      0.91      1082


On Training Data:
Principal Component Analysis (PCA) ROC:0.7915, precision @ rank n:0.3926

On Test Data:
Principal Component Analysis (PCA) ROC:0.8405, precision @ rank n:0.5248
--------------------------------------------------------------------------------
In [43]:
anomaly_models = ['Angle-based Outlier Detector (ABOD)',
                    'Isolation Forest',
                    'Local Outlier Factor (LOF)',
                    'Principal Component Analysis (PCA)']
anomaly_score = pd.DataFrame({'Train Precision': train_precision, 'Train Recall': train_recall, 'Train F1': train_f1, \
                              'Test Precision': test_precision, 'Test Recall': test_recall, 'Test F1': test_f1}, index = anomaly_models)
anomaly_score.sort_values(by = 'Test F1', ascending = False)
Out[43]:
Train Precision Train Recall Train F1 Test Precision Test Recall Test F1
Isolation Forest 0.506173 0.506173 0.506173 0.556522 0.633663 0.592593
Principal Component Analysis (PCA) 0.392593 0.392593 0.392593 0.482759 0.554455 0.516129
Angle-based Outlier Detector (ABOD) 0.088889 0.088889 0.088889 0.162162 0.178218 0.169811
Local Outlier Factor (LOF) 0.049383 0.049383 0.049383 0.080000 0.079208 0.079602
In [44]:
anomaly_sorted_score = anomaly_score.sort_values(by = 'Test F1', ascending = False)

anomaly_sorted_score.plot.bar(rot=90,colormap = 'Set3', figsize=(18,6))
plt.title('Unsupervised Anomaly Detection Models Evaluation Scores', fontsize = 15)
plt.show()

Supervised Models

In [34]:
from sklearn.decomposition import PCA
# perform PCA to reduce the dimension for clustering

# Create scaler: scaler
scaler = StandardScaler()

# Create a PCA instance: pca
pca = PCA()

# Create pipeline: pipeline
pipeline = make_pipeline(scaler, pca)

# Fit the pipeline to the samples
pipeline.fit(X_train)

# Plot the explained variances ratio
features = range(pca.n_components_)
plt.plot(features, pca.explained_variance_ratio_.cumsum())
plt.hlines(y = 0.95, xmin= 0 , xmax = len(features), color = 'r', linestyles = 'dashed')
plt.xlabel('PCA feature')
plt.ylabel('Cumulative Importance')
plt.title('Cumulative Importances')
plt.show()
In [35]:
# find number of features for cumulative importance of 95%
print('Number of features for 95% importance:', np.where(pca.explained_variance_ratio_.cumsum() > 0.95)[0][0])
Number of features for 95% importance: 25

Base Models

In [36]:
from sklearn.decomposition import PCA

train_score = []
test_score = []
training_time = []

def build_model(input_model, model_name):

    # define which resampling method and which ML model to use in the pipeline
    scaler = StandardScaler()
    pca = PCA(n_components = 25)
    resampling = ADASYN(random_state = SEED, sampling_strategy = 1.0)
    model = input_model

    # define the pipeline, tell it to combine ADASYN with the Logistic Regression model
    pipeline = Pipeline([('Scaler', scaler), ('PCA', pca), ('ADASYN', resampling), ('Classifier', model)])
    
    # fit the data and get the train score
    start = time.time()
    pipeline.fit(X_train, y_train)
    stop = time.time()
    y_pred_train = pipeline.predict(X_train)
    train_score.append(f1_score(y_train, y_pred_train))
    
    # training time
    train_time = stop - start
    training_time.append(train_time)
    
    # predict
    y_pred = pipeline.predict(X_test)
    test_score.append(f1_score(y_test, y_pred))

    return pipeline
In [37]:
nb = build_model(GaussianNB(), 'Naive Bayes')
logreg = build_model(LogisticRegression(random_state = SEED), 'Logistic Regression')
knn = build_model(KNeighborsClassifier(), 'KNN')
svc = build_model(SVC(random_state = SEED), 'Support Vector Classifier')
dt = build_model(DecisionTreeClassifier(max_depth = 10, random_state = SEED), 'Decision Tree')
rf = build_model(RandomForestClassifier(n_estimators = 100, max_depth = 10, random_state = SEED), 'Random Forest')
xgb = build_model(XGBClassifier(n_estimators = 100, max_depth = 10,random_state = SEED), 'XGBoost')
In [38]:
# take a look at the scores and go back to tune the hyperparameters if see any indication of overfitting or underfitting
classifiers = ['Naive Bayes', 'Logistic Regression', 'KNN', 'SVM', 'Decision Tree', 'Random Forest', 'XGBoost']
result = pd.DataFrame({'Train F1': train_score, 'Test F1': test_score, 'Training Time': training_time}, index = classifiers)
result.sort_values(by = 'Test F1', ascending = False)
Out[38]:
Train F1 Test F1 Training Time
XGBoost 1.000000 0.578125 4.826042
Random Forest 0.688776 0.525373 2.539600
Logistic Regression 0.497954 0.510526 0.107935
SVM 0.528640 0.494505 1.569570
KNN 0.557084 0.446154 0.082220
Decision Tree 0.713781 0.432099 0.260205
Naive Bayes 0.287397 0.292135 0.084547
In [39]:
# visualize the metrics
base_score = result.iloc[:, 0:2].sort_values(by = 'Test F1', ascending = False)

fig = plt.figure()

base_score.plot.bar(rot=0, colormap = 'Set3', figsize=(12,6))
plt.title('Baseline Model F1 Scores', fontsize = 15)

plt.show()
<Figure size 432x288 with 0 Axes>
In [40]:
# visualize the training time
base_time = result.iloc[:, 2].sort_values()

fig = plt.figure()

base_time.plot.bar(rot=0, colormap = 'Set3', figsize=(12, 6))
plt.title('Baseline Model Training Time', fontsize = 15)

plt.show()
In [41]:
# visualize the classification report
def v_clfreport(model, title):
    y_pred = model.predict(X_test)
    clf_report = classification_report(y_test, y_pred, output_dict=True)
    df = pd.DataFrame(clf_report).iloc[:-1, :2].T
    
    fig, ax = plt.subplots(figsize = (6, 2))
    sns.heatmap(df, annot=True)
    plt.title(title)
    ax.set_ylim(len(df)+0, -0)
    
    plt.show()
In [42]:
# visualize classification report on the test set
v_clfreport(nb, 'Baseline Model Naive Bayes Classification Report')
v_clfreport(logreg, 'Baseline Model Logistic Regression Classification Report')
v_clfreport(xgb, 'Baseline Model XGBoost Classification Report')
v_clfreport(knn, 'Baseline Model KNN Classification Report')
v_clfreport(rf, 'Baseline Model Random Forest Classification Report')
v_clfreport(svc, 'Baseline Model SVM Classification Report')
v_clfreport(dt, 'Baseline Model Decision Tree Classification Report')

Hyperparameter Tuning

In [43]:
def build_tune_model(input_model, param_dist):

    # define which resampling method and which ML model to use in the pipeline
    scaler = StandardScaler()
    pca = PCA(n_components = 25)
    resampling = ADASYN(random_state = SEED, sampling_strategy = 1.0)
    model = input_model

    # define the pipeline, tell it to combine ADASYN with the Logistic Regression model
    pipeline = Pipeline([('Scaler', scaler), ('PCA', pca), ('ADASYN', resampling), ('Classifier', model)])
    
    # stratified k fold
    kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=SEED)

    # tune hyperparameter
    pipeline = RandomizedSearchCV(pipeline, param_distributions = param_dist, scoring = 'f1', cv = kfold, n_iter = 10, n_jobs = -1, random_state = SEED)

    # fit the data
    pipeline.fit(X_train, y_train)
    pipeline = pipeline.best_estimator_
    
    return pipeline
In [44]:
# define param_dist
logreg_param = {'Classifier__C' : np.logspace(-4, 4, 20)}
knn_param = {'Classifier__n_neighbors': range(5, 10)}
svc_param = {'Classifier__C' : np.logspace(-4, 4, 20),
             'Classifier__gamma': np.logspace(-4, 4, 20)}
dt_param = {'Classifier__max_depth': range(3, 5),
            'Classifier__max_features': range(1, 12),
            'Classifier__min_samples_leaf': range(5, 10),
            'Classifier__criterion': ["gini", "entropy"]}
rf_param = {'Classifier__n_estimators': range(400, 1000, 10),
            'Classifier__max_features': ['auto', 'sqrt'],
            'Classifier__max_depth': range(3, 7),
            'Classifier__min_samples_split': range(2, 8),
            'Classifier__min_samples_leaf': range(3, 10)}
xgb_param = {'Classifier__n_estimators': range(20, 200, 10),
             'Classifier__learning_rate': [0.0001, 0.001, 0.01, 1, 2, 5],
             'Classifier__max_depth': range(3, 5), 
             'Classifier__min_samples_split': range(2, 10),
             'Classifier__min_samples_leaf':range(5, 10),
             'Classifier__max_features': range(3, 12),
             'Classifier__subsample': [0.6, 0.7, 0.75, 0.8]}
In [45]:
logreg1 = build_tune_model(LogisticRegression(random_state = SEED), logreg_param)
knn1 = build_tune_model(KNeighborsClassifier(), knn_param)
svc1 = build_tune_model(SVC(random_state = SEED), svc_param)
dt1 = build_tune_model(DecisionTreeClassifier(random_state = SEED), dt_param)
rf1 = build_tune_model(RandomForestClassifier(random_state = SEED), rf_param)
xgb1 = build_tune_model(XGBClassifier(n_iter_no_change=5, random_state = SEED), xgb_param)
In [46]:
train_score_1 = []
cv_score_1 = []
test_precision_1 = []
test_recall_1 = []
test_f1_1 = []
In [47]:
def score(model):
    y_train_pred = model.predict(X_train)
    y_test_pred = model.predict(X_test)
    
    train_f1 = f1_score(y_train, y_train_pred)
    kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=SEED)
    cv_f1 = np.mean(cross_val_score(model, X_train, y_train, cv=kfold, scoring='f1', n_jobs=-1))
    test_precision = precision_score(y_test, y_test_pred)
    test_recall = recall_score(y_test, y_test_pred)
    test_f1 = f1_score(y_test, y_test_pred)
    
    train_score_1.append(train_f1)
    cv_score_1.append(cv_f1)
    test_precision_1.append(test_precision)
    test_recall_1.append(test_recall)
    test_f1_1.append(test_f1)
In [48]:
score(nb)
score(logreg1)
score(knn1)
score(svc1)
score(dt1)
score(rf1)
score(xgb1)
In [49]:
# take a look at the scores and go back to tune the hyperparameters if see any indication of overfitting or underfitting
classifiers = ['Naive Bayes', 'Logistic Regression', 'KNN', 'SVM', 'Decision Tree', 'Random Forest', 'XGBoost']
result1 = pd.DataFrame({'Train F1': train_score_1, 'CV F1': cv_score_1, 'Test Precision': test_precision_1, \
                        'Test Recall': test_recall_1, 'Test F1': test_f1_1}, index = classifiers)
result1.sort_values(by = 'Test F1', ascending = False)
Out[49]:
Train F1 CV F1 Test Precision Test Recall Test F1
Logistic Regression 0.504213 0.502871 0.386179 0.940594 0.547550
XGBoost 0.502313 0.472281 0.356364 0.970297 0.521277
Random Forest 0.529973 0.479648 0.342960 0.940594 0.502646
SVM 0.473786 0.474881 0.339286 0.940594 0.498688
Decision Tree 0.474490 0.464934 0.327526 0.930693 0.484536
KNN 0.584838 0.434785 0.313869 0.851485 0.458667
Naive Bayes 0.287397 0.284968 0.174330 0.900990 0.292135
In [50]:
# visualize the metrics
tuned_score = result1.sort_values(by = 'Test F1', ascending = False)

fig = plt.figure()

tuned_score.plot.bar(rot=0, colormap = 'Set3', figsize=(12,6))
plt.title('Final Models Scores', fontsize = 15)

plt.show()
<Figure size 432x288 with 0 Axes>
In [51]:
# visualize classification report on the test set
v_clfreport(logreg1, 'Logistic Regression Classification Report')
v_clfreport(xgb1, 'XGBoost Classification Report')
v_clfreport(knn1, 'KNN Classification Report')
v_clfreport(rf1, 'Random Forest Classification Report')
v_clfreport(svc1, 'SVM Classification Report')
v_clfreport(dt1, 'Decision Tree Classification Report')
In [52]:
# final model -> logreg
logreg1.steps[3][1].get_params()
Out[52]:
{'C': 0.0001,
 'class_weight': None,
 'dual': False,
 'fit_intercept': True,
 'intercept_scaling': 1,
 'l1_ratio': None,
 'max_iter': 100,
 'multi_class': 'auto',
 'n_jobs': None,
 'penalty': 'l2',
 'random_state': 42,
 'solver': 'lbfgs',
 'tol': 0.0001,
 'verbose': 0,
 'warm_start': False}
In [55]:
# plot the precision recall curve
y_pred_proba = logreg1.predict_proba(X_test)

thresholds = [0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9]
colors = cycle(['navy', 'turquoise', 'darkorange', 'cornflowerblue', 'teal', 'red', 'yellow', 'green', 'blue','black'])

plt.figure(figsize=(10,10))

j = 1
for i,color in zip(thresholds,colors):
    y_test_prob = y_pred_proba[:,1] > i
    
    precision, recall, thresholds = precision_recall_curve(y_test, y_test_prob)
    
    # Plot Precision-Recall curve
    plt.plot(recall, precision, color=color,
                 label='Threshold: %s'%i)
    plt.xlabel('Recall')
    plt.ylabel('Precision')
    plt.ylim([0.0, 1.05])
    plt.xlim([0.0, 1.0])
    plt.title('Logistic Regression Precision-Recall Curve', fontsize = 15)
    plt.legend(loc="lower left")
    
baseline = len(y_test[y_test==1]) / len(y_test)
plt.plot([0, 1], [baseline, baseline], linestyle='--', label='Baseline')
plt.legend(loc="lower left")

plt.show()
In [54]:
figure, ax = plt.subplots(figsize=(10,10))

plot_precision_recall_curve(logreg1, X_test, y_test, name = 'Logistic Regression', ax = ax)
plot_precision_recall_curve(xgb1, X_test, y_test, name = 'XGBoost', ax = ax)
plot_precision_recall_curve(rf1, X_test, y_test, name = 'Random Forest', ax = ax)

baseline = len(y_test[y_test==1]) / len(y_test)
plt.plot([0, 1], [baseline, baseline], linestyle='--', label='Baseline')

plt.xlabel('Recall')
plt.ylabel('Precision')
plt.ylim([0.0, 1.05])
plt.xlim([0.0, 1.0])
plt.title('Precision-Recall Curve', fontsize = 15)
plt.legend(loc="lower left")

plt.show()

Autoencoders Fraud Detection

In [1]:
import pandas as pd
from pandas.plotting import scatter_matrix
import numpy as np
import pickle
import matplotlib.pyplot as plt
from scipy import stats
import tensorflow as tf
import seaborn as sns
from pylab import rcParams
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import mean_squared_error
import h5py
from keras.models import Model, load_model
from keras.layers import Input, Dense
from keras.callbacks import ModelCheckpoint, EarlyStopping
from keras import regularizers
%matplotlib inline
sns.set(style='whitegrid', palette='muted', font_scale=1.5)
RANDOM_SEED = 42
LABELS = ["Normal", "Fraud"]
Using TensorFlow backend.
In [4]:
df = pd.read_csv("C:/Users/Carrie/Desktop/MScA Courses/HealthAnalytics/FinalProject/input/merge.csv")
In [5]:
print(df.shape)
df.head()
(5408, 66)
Out[5]:
Provider AttendingPhysician AvgAge InDaysStd InDaysMean TotalInDays UniBeneStd UniBeneMean TotalPatients ClaimDaysStd ... Diagnosis_Count_Std Diagnosis_Count_Mean procedure_count_Std procedure_count_Mean unique_admitcode unique_DRG Admit_unique_Std Admit_unique_Mean DRG_unique_Std DRG_unique_Mean
0 PRV51001 14 78.160000 2.499621 1.208333 25.0 1.505042 2.083333 24 1.375651 ... 1.866580 1.848810 0.121630 0.046429 11 5 0.974961 0.785714 0.744946 0.357143
1 PRV51003 44 69.480916 2.121219 4.948611 305.0 3.010084 10.833333 117 1.671003 ... 1.634357 5.005076 0.218508 0.310739 58 58 3.078640 5.357143 2.376626 4.428571
2 PRV51004 38 71.778523 0.000000 0.000000 0.0 3.629634 12.416667 138 1.229821 ... 1.031048 2.212305 0.000000 0.000000 25 0 1.881080 2.000000 0.000000 0.000000
3 PRV51005 6 70.118659 0.000000 0.000000 0.0 8.913728 82.000000 495 0.475384 ... 0.774761 2.467857 0.000000 0.000000 158 0 10.492541 16.642857 0.000000 0.000000
4 PRV51007 10 68.791667 2.498484 1.333333 16.0 2.391589 5.916667 58 1.130750 ... 1.328274 2.380896 0.029696 0.007937 17 3 1.251373 1.214286 0.425815 0.214286

5 rows × 66 columns

In [6]:
df.isnull().values.any()
Out[6]:
False
In [7]:
df.drop('Provider', axis=1, inplace=True)
In [8]:
frauds = df[df.PotentialFraud == 1]
normal = df[df.PotentialFraud == 0]
In [9]:
frauds.shape
Out[9]:
(506, 65)
In [10]:
normal.shape
Out[10]:
(4902, 65)

Training an autoencoder for anomalies detection is done using only normal data. Then any new observations that cannot be well predicted by such autoencoder are anomalies.

Such approach has two important benefits in comparison to classifiers:

  • Imbalance of the data is not a problem: there is plenty of data to train the model
  • Anomalies detection is not trained for any particular type of anomaly: anything that is different from normal can be detected

Reserve 20% of the data for testing. Parameter stratify helps keeping the class size ratio within each data set.

In [11]:
X_train_split, X_test_split = train_test_split(df, test_size=0.2,
                                   stratify=df['PotentialFraud'], 
                                   random_state=RANDOM_SEED)

Extract the labels from train and test data.

In [12]:
y_train = X_train_split['PotentialFraud']
X_train = X_train_split.drop(['PotentialFraud'], axis=1)

y_test = X_test_split['PotentialFraud']
X_test = X_test_split.drop(['PotentialFraud'], axis=1)
print('Train: shape X',X_train.shape,', shape Y',y_train.shape)
print('Test: shape X',X_test.shape,', shape Y',y_test.shape)
Train: shape X (4326, 64) , shape Y (4326,)
Test: shape X (1082, 64) , shape Y (1082,)

Select the "normal" transactions from the training data to train autoencoder on them.

In [13]:
X_trainNorm = X_train[y_train == 0]
X_trainNorm_val = X_trainNorm.values # Only values, axis labels removed. This is input for the Autoencoder
X_testNorm_val = X_test[y_test == 0].values # The validation data
In [14]:
print(y_train.shape)
print(X_train.shape)
(4326,)
(4326, 64)
In [15]:
X_trainNorm_val.shape
Out[15]:
(3921, 64)

Creating the model

This autoencoder contains fully connected layers with 14, 7, 14 and 29 neurons, respectively. The first two layers make encoder, the last two make decoder.

Training is done with $L_1$ regularization.

Set parameters:

In [16]:
input_dim = X_trainNorm_val.shape[1]
layer1_dim = 14
encoder_dim = 7

Create tensors:

In [17]:
input_layer = Input(shape=(input_dim, ))

encoder1 = Dense(layer1_dim, activation="tanh", 
                activity_regularizer=regularizers.l1(10e-5))(input_layer)
encoder2 = Dense(encoder_dim, activation="relu")(encoder1)
decoder1 = Dense(layer1_dim, activation='tanh')(encoder2)
decoder2 = Dense(input_dim, activation='linear')(decoder1)
print('input_layer: ',input_layer)
print('encoder1',encoder1)
print('encoder2',encoder2)
print('decoder1',decoder1)
print('decoder2',decoder2)
input_layer:  Tensor("input_1:0", shape=(?, 64), dtype=float32)
encoder1 Tensor("dense_1/Tanh:0", shape=(?, 14), dtype=float32)
encoder2 Tensor("dense_2/Relu:0", shape=(?, 7), dtype=float32)
decoder1 Tensor("dense_3/Tanh:0", shape=(?, 14), dtype=float32)
decoder2 Tensor("dense_4/BiasAdd:0", shape=(?, 64), dtype=float32)

Create autoencoder from the tensors:

In [18]:
autoencoder = Model(inputs=input_layer, outputs=decoder2)
autoencoder.summary()
Model: "model_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 64)                0         
_________________________________________________________________
dense_1 (Dense)              (None, 14)                910       
_________________________________________________________________
dense_2 (Dense)              (None, 7)                 105       
_________________________________________________________________
dense_3 (Dense)              (None, 14)                112       
_________________________________________________________________
dense_4 (Dense)              (None, 64)                960       
=================================================================
Total params: 2,087
Trainable params: 2,087
Non-trainable params: 0
_________________________________________________________________

Train the model for 100 epochs with a batch size of 32 samples and save the best performing model to a file using ModelCheckpoint provided by Keras.

Use the EarlyStopping callback that stops training when a monitored quantity has stopped improving.

In [19]:
%%time
nb_epoch = 1000000
batch_size = 32

autoencoder.compile(optimizer='adam', 
                    loss='mean_squared_error')

checkpointer = ModelCheckpoint(filepath="model.h5",
                               verbose=0,
                               save_best_only=True)
earlystopping = EarlyStopping(monitor='val_loss', patience=1, verbose=0) # 'patience' number of not improving epochs
history = autoencoder.fit(X_trainNorm_val, X_trainNorm_val,
                    epochs=nb_epoch,
                    batch_size=batch_size,
                    shuffle=True,
                    validation_data=(X_testNorm_val, X_testNorm_val),
                    verbose=1,
                    callbacks=[checkpointer, #tensorboard, 
                               earlystopping]).history
WARNING:tensorflow:From C:\ProgramData\Anaconda3\lib\site-packages\keras\backend\tensorflow_backend.py:422: The name tf.global_variables is deprecated. Please use tf.compat.v1.global_variables instead.

Train on 3921 samples, validate on 981 samples
Epoch 1/1000000
3921/3921 [==============================] - 1s 201us/step - loss: 208529697.6384 - val_loss: 182541040.6402
Epoch 2/1000000
3921/3921 [==============================] - 0s 77us/step - loss: 208524700.0296 - val_loss: 182536690.0061
Epoch 3/1000000
3921/3921 [==============================] - 0s 74us/step - loss: 208520441.0385 - val_loss: 182532742.3772
Epoch 4/1000000
3921/3921 [==============================] - 0s 78us/step - loss: 208516412.6825 - val_loss: 182528899.9348
Epoch 5/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 208512507.1115 - val_loss: 182525169.4230
Epoch 6/1000000
3921/3921 [==============================] - 0s 79us/step - loss: 208508647.2104 - val_loss: 182521429.2151
Epoch 7/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 208504810.4586 - val_loss: 182517752.4444
Epoch 8/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 208501003.8827 - val_loss: 182514050.9806
Epoch 9/1000000
3921/3921 [==============================] - 0s 73us/step - loss: 208497202.4851 - val_loss: 182510410.2141
Epoch 10/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 208493412.6600 - val_loss: 182506769.8471
Epoch 11/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 208489632.3346 - val_loss: 182503121.8226
Epoch 12/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 208485855.9633 - val_loss: 182499464.8359
Epoch 13/1000000
3921/3921 [==============================] - 0s 104us/step - loss: 208482086.7167 - val_loss: 182495833.6799
Epoch 14/1000000
3921/3921 [==============================] - 0s 99us/step - loss: 208478330.9633 - val_loss: 182492209.6147
Epoch 15/1000000
3921/3921 [==============================] - 0s 77us/step - loss: 208474585.8587 - val_loss: 182488587.1152
Epoch 16/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 208470844.4662 - val_loss: 182484971.8777
Epoch 17/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 208467112.5509 - val_loss: 182481345.7207
Epoch 18/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 208463379.5052 - val_loss: 182477793.4924
Epoch 19/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 208459656.6794 - val_loss: 182474168.1182
Epoch 20/1000000
3921/3921 [==============================] - 0s 76us/step - loss: 208455929.0059 - val_loss: 182470548.8359
Epoch 21/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 208452211.3900 - val_loss: 182466958.2548
Epoch 22/1000000
3921/3921 [==============================] - 0s 79us/step - loss: 208448496.7223 - val_loss: 182463388.0652
Epoch 23/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 208444771.4114 - val_loss: 182459778.9113
Epoch 24/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 208441065.4180 - val_loss: 182456208.0693
Epoch 25/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 208437352.3326 - val_loss: 182452626.6177
Epoch 26/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 208433634.1627 - val_loss: 182449054.5525
Epoch 27/1000000
3921/3921 [==============================] - 0s 102us/step - loss: 208429929.4751 - val_loss: 182445433.8349
Epoch 28/1000000
3921/3921 [==============================] - 0s 103us/step - loss: 208426215.3451 - val_loss: 182441889.5617
Epoch 29/1000000
3921/3921 [==============================] - 0s 74us/step - loss: 208422511.8378 - val_loss: 182438279.2742
Epoch 30/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 208418809.7587 - val_loss: 182434712.1305
Epoch 31/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 208415115.4991 - val_loss: 182431129.1947
Epoch 32/1000000
3921/3921 [==============================] - 0s 79us/step - loss: 208411414.6391 - val_loss: 182427584.5749
Epoch 33/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 208407720.7814 - val_loss: 182424020.5586
Epoch 34/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 208404022.3484 - val_loss: 182420438.0999
Epoch 35/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 208400335.6613 - val_loss: 182416874.0836
Epoch 36/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 208396635.2395 - val_loss: 182413294.8053
Epoch 37/1000000
3921/3921 [==============================] - 0s 76us/step - loss: 208392949.0844 - val_loss: 182409732.4363
Epoch 38/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 208389267.0156 - val_loss: 182406185.4679
Epoch 39/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 208385577.5649 - val_loss: 182402633.3211
Epoch 40/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 208381887.1186 - val_loss: 182399065.9980
Epoch 41/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 208378205.2130 - val_loss: 182395484.1101
Epoch 42/1000000
3921/3921 [==============================] - 0s 102us/step - loss: 208374540.2581 - val_loss: 182391944.9664
Epoch 43/1000000
3921/3921 [==============================] - 0s 98us/step - loss: 208370865.1548 - val_loss: 182388419.2987
Epoch 44/1000000
3921/3921 [==============================] - 0s 73us/step - loss: 208367186.9421 - val_loss: 182384889.7207
Epoch 45/1000000
3921/3921 [==============================] - 0s 79us/step - loss: 208363511.6185 - val_loss: 182381320.2202
Epoch 46/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 208359833.9118 - val_loss: 182377751.3354
Epoch 47/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 208356137.7608 - val_loss: 182374196.3588
Epoch 48/1000000
3921/3921 [==============================] - 0s 73us/step - loss: 208352472.4825 - val_loss: 182370623.6453
Epoch 49/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 208348800.2734 - val_loss: 182367093.0194
Epoch 50/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 208345135.3231 - val_loss: 182363537.3496
Epoch 51/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 208341473.5506 - val_loss: 182360031.9021
Epoch 52/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 208337810.2239 - val_loss: 182356469.8389
Epoch 53/1000000
3921/3921 [==============================] - 0s 72us/step - loss: 208334141.4471 - val_loss: 182352968.2691
Epoch 54/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 208330489.7730 - val_loss: 182349415.4659
Epoch 55/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 208326829.6435 - val_loss: 182345866.2752
Epoch 56/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 208323173.6190 - val_loss: 182342364.0041
Epoch 57/1000000
3921/3921 [==============================] - 0s 89us/step - loss: 208319516.5478 - val_loss: 182338813.6391
Epoch 58/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 208315856.2571 - val_loss: 182335297.6269
Epoch 59/1000000
3921/3921 [==============================] - 0s 77us/step - loss: 208312204.6254 - val_loss: 182331739.9959
Epoch 60/1000000
3921/3921 [==============================] - 0s 74us/step - loss: 208308549.8352 - val_loss: 182328217.3293
Epoch 61/1000000
3921/3921 [==============================] - 0s 78us/step - loss: 208304889.4384 - val_loss: 182324677.4475
Epoch 62/1000000
3921/3921 [==============================] - 0s 74us/step - loss: 208301219.5460 - val_loss: 182321133.2110
Epoch 63/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 208297555.8806 - val_loss: 182317627.3313
Epoch 64/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 208293880.6182 - val_loss: 182314066.2222
Epoch 65/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 208290223.3063 - val_loss: 182310519.1193
Epoch 66/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 208286569.3690 - val_loss: 182307013.0194
Epoch 67/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 208282926.9452 - val_loss: 182303460.4730
Epoch 68/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 208279266.7914 - val_loss: 182299935.2864
Epoch 69/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 208275620.3948 - val_loss: 182296409.6188
Epoch 70/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 208271968.1449 - val_loss: 182292884.4771
Epoch 71/1000000
3921/3921 [==============================] - 0s 101us/step - loss: 208268317.1681 - val_loss: 182289368.8522
Epoch 72/1000000
3921/3921 [==============================] - 0s 104us/step - loss: 208264648.9814 - val_loss: 182285835.8777
Epoch 73/1000000
3921/3921 [==============================] - 0s 78us/step - loss: 208261000.3489 - val_loss: 182282311.4740
Epoch 74/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 208257345.9036 - val_loss: 182278795.5025
Epoch 75/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 208253694.6514 - val_loss: 182275238.5240
Epoch 76/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 208250039.9082 - val_loss: 182271715.5515
Epoch 77/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 208246392.8967 - val_loss: 182268208.1060
Epoch 78/1000000
3921/3921 [==============================] - 0s 79us/step - loss: 208242744.5529 - val_loss: 182264680.9134
Epoch 79/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 208239093.5659 - val_loss: 182261169.9450
Epoch 80/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 208235449.2798 - val_loss: 182257607.0051
Epoch 81/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 208231807.9776 - val_loss: 182254082.5117
Epoch 82/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 208228159.5919 - val_loss: 182250579.8899
Epoch 83/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 208224502.3596 - val_loss: 182247043.7431
Epoch 84/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 208220859.4491 - val_loss: 182243524.7258
Epoch 85/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 208217217.7934 - val_loss: 182240001.3170
Epoch 86/1000000
3921/3921 [==============================] - 0s 104us/step - loss: 208213571.4522 - val_loss: 182236487.7798
Epoch 87/1000000
3921/3921 [==============================] - 0s 94us/step - loss: 208209930.7564 - val_loss: 182232976.0285
Epoch 88/1000000
3921/3921 [==============================] - 0s 76us/step - loss: 208206285.0681 - val_loss: 182229450.2263
Epoch 89/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 208202648.0102 - val_loss: 182225921.5576
Epoch 90/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 208199017.1548 - val_loss: 182222431.2416
Epoch 91/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 208195388.6600 - val_loss: 182218910.6585
Epoch 92/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 208191746.5014 - val_loss: 182215414.2548
Epoch 93/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 208188118.8261 - val_loss: 182211886.4546
Epoch 94/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 208184483.8990 - val_loss: 182208414.1407
Epoch 95/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 208180853.7985 - val_loss: 182204919.6493
Epoch 96/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 208177223.4797 - val_loss: 182201371.7554
Epoch 97/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 208173585.8812 - val_loss: 182197867.0010
Epoch 98/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 208169944.9243 - val_loss: 182194367.9021
Epoch 99/1000000
3921/3921 [==============================] - 0s 71us/step - loss: 208166306.5055 - val_loss: 182190863.8858
Epoch 100/1000000
3921/3921 [==============================] - 0s 103us/step - loss: 208162670.2892 - val_loss: 182187305.6432
Epoch 101/1000000
3921/3921 [==============================] - 0s 101us/step - loss: 208159036.9069 - val_loss: 182183814.1529
Epoch 102/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 208155414.8513 - val_loss: 182180305.9164
Epoch 103/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 208151783.2471 - val_loss: 182176814.8216
Epoch 104/1000000
3921/3921 [==============================] - 0s 70us/step - loss: 208148148.2346 - val_loss: 182173271.9715
Epoch 105/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 208144523.0747 - val_loss: 182169782.8257
Epoch 106/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 208140897.4935 - val_loss: 182166286.0714
Epoch 107/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 208137267.5542 - val_loss: 182162790.7115
Epoch 108/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 208133635.2318 - val_loss: 182159290.2181
Epoch 109/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 208129998.1760 - val_loss: 182155783.6779
Epoch 110/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 208126372.9579 - val_loss: 182152285.0520
Epoch 111/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 208122748.8498 - val_loss: 182148755.0785
Epoch 112/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 208119127.1563 - val_loss: 182145275.7146
Epoch 113/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 208115511.9123 - val_loss: 182141768.1753
Epoch 114/1000000
3921/3921 [==============================] - 0s 93us/step - loss: 208111877.0967 - val_loss: 182138298.3405
Epoch 115/1000000
3921/3921 [==============================] - 0s 104us/step - loss: 208108249.0365 - val_loss: 182134793.3660
Epoch 116/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 208104634.7605 - val_loss: 182131304.3955
Epoch 117/1000000
3921/3921 [==============================] - 0s 73us/step - loss: 208101007.8980 - val_loss: 182127769.0683
Epoch 118/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 208097382.9554 - val_loss: 182124277.2722
Epoch 119/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 208093758.6371 - val_loss: 182120780.4281
Epoch 120/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 208090148.9804 - val_loss: 182117288.4159
Epoch 121/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 208086547.5868 - val_loss: 182113830.7523
Epoch 122/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 208082939.1084 - val_loss: 182110319.9511
Epoch 123/1000000
3921/3921 [==============================] - 0s 77us/step - loss: 208079330.4851 - val_loss: 182106849.7166
Epoch 124/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 208075730.8115 - val_loss: 182103368.1386
Epoch 125/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 208072119.1941 - val_loss: 182099887.3435
Epoch 126/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 208068523.2461 - val_loss: 182096417.5454
Epoch 127/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 208064929.2752 - val_loss: 182092909.8349
Epoch 128/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 208061323.5149 - val_loss: 182089458.4343
Epoch 129/1000000
3921/3921 [==============================] - 0s 117us/step - loss: 208057721.5771 - val_loss: 182085983.1560
Epoch 130/1000000
3921/3921 [==============================] - 1s 142us/step - loss: 208054112.6998 - val_loss: 182082500.7951
Epoch 131/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 208050512.0133 - val_loss: 182079008.7339
Epoch 132/1000000
3921/3921 [==============================] - 0s 89us/step - loss: 208046907.6134 - val_loss: 182075552.5953
Epoch 133/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 208043299.9765 - val_loss: 182072062.3160
Epoch 134/1000000
3921/3921 [==============================] - 0s 91us/step - loss: 208039699.3502 - val_loss: 182068587.9103
Epoch 135/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 208036071.5654 - val_loss: 182065089.5413
Epoch 136/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 208032468.4274 - val_loss: 182061587.6126
Epoch 137/1000000
3921/3921 [==============================] - 0s 91us/step - loss: 208028861.3129 - val_loss: 182058134.9888
Epoch 138/1000000
3921/3921 [==============================] - 0s 92us/step - loss: 208025262.8605 - val_loss: 182054653.9286
Epoch 139/1000000
3921/3921 [==============================] - 0s 72us/step - loss: 208021675.1951 - val_loss: 182051170.6544
Epoch 140/1000000
3921/3921 [==============================] - 0s 90us/step - loss: 208018078.9370 - val_loss: 182047719.4699
Epoch 141/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 208014497.6363 - val_loss: 182044238.5362
Epoch 142/1000000
3921/3921 [==============================] - 0s 110us/step - loss: 208010903.3002 - val_loss: 182040754.4791
Epoch 143/1000000
3921/3921 [==============================] - 1s 132us/step - loss: 208007301.0967 - val_loss: 182037292.3792
Epoch 144/1000000
3921/3921 [==============================] - 0s 114us/step - loss: 208003699.5787 - val_loss: 182033854.3690
Epoch 145/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 208000096.5142 - val_loss: 182030369.9613
Epoch 146/1000000
3921/3921 [==============================] - 0s 89us/step - loss: 207996507.5195 - val_loss: 182026846.8502
Epoch 147/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 207992898.2525 - val_loss: 182023414.3609
Epoch 148/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 207989306.2178 - val_loss: 182019929.2151
Epoch 149/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 207985714.1423 - val_loss: 182016465.9368
Epoch 150/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 207982108.8171 - val_loss: 182012976.5708
Epoch 151/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 207978514.1984 - val_loss: 182009492.9011
Epoch 152/1000000
3921/3921 [==============================] - 0s 93us/step - loss: 207974933.2191 - val_loss: 182006035.9307
Epoch 153/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 207971341.6516 - val_loss: 182002562.8705
Epoch 154/1000000
3921/3921 [==============================] - 0s 94us/step - loss: 207967755.4093 - val_loss: 181999143.7798
Epoch 155/1000000
3921/3921 [==============================] - 0s 95us/step - loss: 207964156.7518 - val_loss: 181995638.8420
Epoch 156/1000000
3921/3921 [==============================] - 0s 113us/step - loss: 207960575.4440 - val_loss: 181992192.8726
Epoch 157/1000000
3921/3921 [==============================] - 0s 102us/step - loss: 207957005.3639 - val_loss: 181988747.7757
Epoch 158/1000000
3921/3921 [==============================] - 0s 91us/step - loss: 207953442.8590 - val_loss: 181985268.6687
Epoch 159/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 207949857.5445 - val_loss: 181981881.1458
Epoch 160/1000000
3921/3921 [==============================] - 0s 89us/step - loss: 207946299.1686 - val_loss: 181978408.4322
Epoch 161/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 207942707.3298 - val_loss: 181974931.4536
Epoch 162/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 207939123.6113 - val_loss: 181971490.3160
Epoch 163/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 207935551.5450 - val_loss: 181968065.6555
Epoch 164/1000000
3921/3921 [==============================] - 0s 96us/step - loss: 207931984.3040 - val_loss: 181964593.9409
Epoch 165/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 207928410.4463 - val_loss: 181961141.3578
Epoch 166/1000000
3921/3921 [==============================] - 0s 89us/step - loss: 207924825.0303 - val_loss: 181957679.5189
Epoch 167/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 207921242.7942 - val_loss: 181954227.0255
Epoch 168/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 207917668.5131 - val_loss: 181950767.0948
Epoch 169/1000000
3921/3921 [==============================] - 0s 90us/step - loss: 207914076.8641 - val_loss: 181947286.0306
Epoch 170/1000000
3921/3921 [==============================] - 0s 106us/step - loss: 207910509.1395 - val_loss: 181943846.3201
Epoch 171/1000000
3921/3921 [==============================] - 0s 90us/step - loss: 207906935.0513 - val_loss: 181940388.1346
Epoch 172/1000000
3921/3921 [==============================] - 0s 77us/step - loss: 207903356.8416 - val_loss: 181936958.9032
Epoch 173/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 207899780.2285 - val_loss: 181933498.1896
Epoch 174/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 207896219.4879 - val_loss: 181930058.3976
Epoch 175/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 207892637.4823 - val_loss: 181926631.7309
Epoch 176/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 207889060.0724 - val_loss: 181923159.0173
Epoch 177/1000000
3921/3921 [==============================] - 0s 78us/step - loss: 207885487.0553 - val_loss: 181919702.0020
Epoch 178/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 207881919.5777 - val_loss: 181916249.8104
Epoch 179/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 207878354.4892 - val_loss: 181912827.3231
Epoch 180/1000000
3921/3921 [==============================] - 0s 92us/step - loss: 207874789.5129 - val_loss: 181909372.7380
Epoch 181/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 207871231.4450 - val_loss: 181905931.1152
Epoch 182/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 207867656.4596 - val_loss: 181902488.7951
Epoch 183/1000000
3921/3921 [==============================] - 0s 98us/step - loss: 207864095.9225 - val_loss: 181899092.5301
Epoch 184/1000000
3921/3921 [==============================] - 0s 110us/step - loss: 207860537.2589 - val_loss: 181895625.5943
Epoch 185/1000000
3921/3921 [==============================] - 0s 90us/step - loss: 207856969.1242 - val_loss: 181892187.1070
Epoch 186/1000000
3921/3921 [==============================] - 0s 77us/step - loss: 207853391.1788 - val_loss: 181888728.6075
Epoch 187/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 207849831.1716 - val_loss: 181885294.8094
Epoch 188/1000000
3921/3921 [==============================] - 0s 93us/step - loss: 207846275.1421 - val_loss: 181881891.9755
Epoch 189/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 207842709.0314 - val_loss: 181878496.4444
Epoch 190/1000000
3921/3921 [==============================] - 0s 75us/step - loss: 207839150.4004 - val_loss: 181874961.8471
Epoch 191/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 207835589.4353 - val_loss: 181871531.6126
Epoch 192/1000000
3921/3921 [==============================] - 0s 76us/step - loss: 207832039.8592 - val_loss: 181868094.9888
Epoch 193/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 207828483.9311 - val_loss: 181864668.2406
Epoch 194/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 207824939.6623 - val_loss: 181861232.6116
Epoch 195/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 207821389.0824 - val_loss: 181857805.8186
Epoch 196/1000000
3921/3921 [==============================] - 0s 93us/step - loss: 207817836.1234 - val_loss: 181854390.3690
Epoch 197/1000000
3921/3921 [==============================] - 0s 97us/step - loss: 207814276.5131 - val_loss: 181850987.4903
Epoch 198/1000000
3921/3921 [==============================] - 0s 121us/step - loss: 207810723.6399 - val_loss: 181847515.2049
Epoch 199/1000000
3921/3921 [==============================] - 0s 96us/step - loss: 207807160.7202 - val_loss: 181844148.5953
Epoch 200/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 207803590.9411 - val_loss: 181840658.8257
Epoch 201/1000000
3921/3921 [==============================] - 0s 90us/step - loss: 207800028.6560 - val_loss: 181837223.6371
Epoch 202/1000000
3921/3921 [==============================] - 0s 93us/step - loss: 207796490.2341 - val_loss: 181833847.6371
Epoch 203/1000000
3921/3921 [==============================] - 0s 92us/step - loss: 207792946.9135 - val_loss: 181830382.7401
Epoch 204/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 207789389.5476 - val_loss: 181826990.2956
Epoch 205/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 207785852.5233 - val_loss: 181823544.3262
Epoch 206/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 207782309.5496 - val_loss: 181820117.3496
Epoch 207/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 207778768.4611 - val_loss: 181816689.1580
Epoch 208/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 207775223.1574 - val_loss: 181813290.2345
Epoch 209/1000000
3921/3921 [==============================] - 0s 93us/step - loss: 207771691.3032 - val_loss: 181809896.0082
Epoch 210/1000000
3921/3921 [==============================] - 0s 89us/step - loss: 207768150.8187 - val_loss: 181806449.6840
Epoch 211/1000000
3921/3921 [==============================] - 1s 131us/step - loss: 207764599.7613 - val_loss: 181803018.5362
Epoch 212/1000000
3921/3921 [==============================] - 0s 121us/step - loss: 207761062.1331 - val_loss: 181799622.3078
Epoch 213/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 207757537.0895 - val_loss: 181796196.1182
Epoch 214/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 207753996.0296 - val_loss: 181792803.1967
Epoch 215/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 207750461.2701 - val_loss: 181789404.4893
Epoch 216/1000000
3921/3921 [==============================] - 0s 90us/step - loss: 207746940.2397 - val_loss: 181785985.4720
Epoch 217/1000000
3921/3921 [==============================] - 0s 96us/step - loss: 207743419.7807 - val_loss: 181782595.7227
Epoch 218/1000000
3921/3921 [==============================] - 0s 91us/step - loss: 207739891.6297 - val_loss: 181779189.7085
Epoch 219/1000000
3921/3921 [==============================] - 0s 92us/step - loss: 207736364.1398 - val_loss: 181775775.0418
Epoch 220/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 207732832.5442 - val_loss: 181772383.5107
Epoch 221/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 207729307.5032 - val_loss: 181768998.7604
Epoch 222/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 207725805.6598 - val_loss: 181765576.3996
Epoch 223/1000000
3921/3921 [==============================] - 0s 92us/step - loss: 207722270.2555 - val_loss: 181762173.2518
Epoch 224/1000000
3921/3921 [==============================] - 0s 94us/step - loss: 207718748.0000 - val_loss: 181758743.0622
Epoch 225/1000000
3921/3921 [==============================] - 0s 111us/step - loss: 207715216.0530 - val_loss: 181755379.4862
Epoch 226/1000000
3921/3921 [==============================] - 0s 104us/step - loss: 207711695.4002 - val_loss: 181751995.0010
Epoch 227/1000000
3921/3921 [==============================] - 0s 79us/step - loss: 207708158.6167 - val_loss: 181748563.2824
Epoch 228/1000000
3921/3921 [==============================] - 0s 89us/step - loss: 207704628.2805 - val_loss: 181745179.3598
Epoch 229/1000000
3921/3921 [==============================] - 0s 78us/step - loss: 207701095.9653 - val_loss: 181741754.9969
Epoch 230/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 207697562.9197 - val_loss: 181738352.2406
Epoch 231/1000000
3921/3921 [==============================] - 0s 75us/step - loss: 207694039.0411 - val_loss: 181734923.7023
Epoch 232/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 207690524.5723 - val_loss: 181731543.1274
Epoch 233/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 207687001.6292 - val_loss: 181728154.8950
Epoch 234/1000000
3921/3921 [==============================] - 0s 99us/step - loss: 207683486.5800 - val_loss: 181724787.8858
Epoch 235/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 207679971.8276 - val_loss: 181721362.7808
Epoch 236/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 207676463.2377 - val_loss: 181718058.6259
Epoch 237/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 207672959.7878 - val_loss: 181714607.6290
Epoch 238/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 207669428.6886 - val_loss: 181711227.4006
Epoch 239/1000000
3921/3921 [==============================] - 0s 104us/step - loss: 207665905.8852 - val_loss: 181707811.7309
Epoch 240/1000000
3921/3921 [==============================] - 0s 100us/step - loss: 207662389.7541 - val_loss: 181704403.6249
Epoch 241/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 207658875.9357 - val_loss: 181701021.2681
Epoch 242/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 207655356.2499 - val_loss: 181697654.1733
Epoch 243/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 207651848.7825 - val_loss: 181694256.1142
Epoch 244/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 207648342.9166 - val_loss: 181690861.2273
Epoch 245/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 207644833.0691 - val_loss: 181687479.4740
Epoch 246/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 207641309.7149 - val_loss: 181684075.9348
Epoch 247/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 207637798.5208 - val_loss: 181680692.5749
Epoch 248/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 207634289.3384 - val_loss: 181677307.8206
Epoch 249/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 207630785.3828 - val_loss: 181673899.7187
Epoch 250/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 207627278.1413 - val_loss: 181670523.9674
Epoch 251/1000000
3921/3921 [==============================] - 0s 79us/step - loss: 207623756.0214 - val_loss: 181667162.0469
Epoch 252/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 207620248.3101 - val_loss: 181663733.6758
Epoch 253/1000000
3921/3921 [==============================] - 0s 99us/step - loss: 207616718.6901 - val_loss: 181660351.6616
Epoch 254/1000000
3921/3921 [==============================] - 0s 98us/step - loss: 207613223.4838 - val_loss: 181656981.5250
Epoch 255/1000000
3921/3921 [==============================] - 0s 72us/step - loss: 207609738.0352 - val_loss: 181653621.3904
Epoch 256/1000000
3921/3921 [==============================] - 0s 75us/step - loss: 207606193.0242 - val_loss: 181650199.2294
Epoch 257/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 207602670.0128 - val_loss: 181646774.1611
Epoch 258/1000000
3921/3921 [==============================] - 0s 94us/step - loss: 207599156.6233 - val_loss: 181643389.2762
Epoch 259/1000000
3921/3921 [==============================] - 0s 75us/step - loss: 207595626.5147 - val_loss: 181639992.8685
Epoch 260/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 207592119.3665 - val_loss: 181636624.0326
Epoch 261/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 207588638.4167 - val_loss: 181633213.4883
Epoch 262/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 207585115.0462 - val_loss: 181629877.2640
Epoch 263/1000000
3921/3921 [==============================] - 0s 89us/step - loss: 207581608.6228 - val_loss: 181626443.7187
Epoch 264/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 207578098.9870 - val_loss: 181623120.3670
Epoch 265/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 207574605.7883 - val_loss: 181619727.3068
Epoch 266/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 207571105.6382 - val_loss: 181616343.4210
Epoch 267/1000000
3921/3921 [==============================] - 0s 115us/step - loss: 207567607.1074 - val_loss: 181613056.2202
Epoch 268/1000000
3921/3921 [==============================] - 0s 111us/step - loss: 207564120.1571 - val_loss: 181609626.3976
Epoch 269/1000000
3921/3921 [==============================] - 0s 79us/step - loss: 207560611.3706 - val_loss: 181606234.5158
Epoch 270/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 207557104.6713 - val_loss: 181602856.8440
Epoch 271/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 207553611.1400 - val_loss: 181599464.9134
Epoch 272/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 207550105.6776 - val_loss: 181596097.4679
Epoch 273/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 207546615.2614 - val_loss: 181592762.5484
Epoch 274/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 207543119.1961 - val_loss: 181589360.4811
Epoch 275/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 207539620.1296 - val_loss: 181585941.8063
Epoch 276/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 207536129.0951 - val_loss: 181582612.0612
Epoch 277/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 207532633.0508 - val_loss: 181579237.7411
Epoch 278/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 207529139.9051 - val_loss: 181575856.2895
Epoch 279/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 207525636.7253 - val_loss: 181572491.2334
Epoch 280/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 207522152.6917 - val_loss: 181569142.2222
Epoch 281/1000000
3921/3921 [==============================] - 0s 103us/step - loss: 207518642.6055 - val_loss: 181565717.0234
Epoch 282/1000000
3921/3921 [==============================] - 0s 109us/step - loss: 207515148.4744 - val_loss: 181562364.2243
Epoch 283/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 207511652.0051 - val_loss: 181559022.2589
Epoch 284/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 207508157.4144 - val_loss: 181555636.9419
Epoch 285/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 207504668.0806 - val_loss: 181552288.0571
Epoch 286/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 207501186.3178 - val_loss: 181548906.9969
Epoch 287/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 207497684.3458 - val_loss: 181545521.9776
Epoch 288/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 207494186.6493 - val_loss: 181542143.9592
Epoch 289/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 207490680.5080 - val_loss: 181538803.8614
Epoch 290/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 207487188.5641 - val_loss: 181535414.6707
Epoch 291/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 207483717.1201 - val_loss: 181532169.4353
Epoch 292/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 207480237.3272 - val_loss: 181528689.2926
Epoch 293/1000000
3921/3921 [==============================] - 0s 76us/step - loss: 207476721.5384 - val_loss: 181525347.5433
Epoch 294/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 207473233.0854 - val_loss: 181521942.4750
Epoch 295/1000000
3921/3921 [==============================] - 0s 101us/step - loss: 207469757.5190 - val_loss: 181518586.6340
Epoch 296/1000000
3921/3921 [==============================] - 0s 109us/step - loss: 207466275.9092 - val_loss: 181515255.8858
Epoch 297/1000000
3921/3921 [==============================] - 0s 78us/step - loss: 207462803.2196 - val_loss: 181511905.5698
Epoch 298/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 207459322.7942 - val_loss: 181508531.9388
Epoch 299/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 207455851.9235 - val_loss: 181505197.8022
Epoch 300/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 207452359.9980 - val_loss: 181501815.1274
Epoch 301/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 207448866.3627 - val_loss: 181498436.6728
Epoch 302/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 207445397.9911 - val_loss: 181495112.4485
Epoch 303/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 207441936.9426 - val_loss: 181491757.3007
Epoch 304/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 207438479.5068 - val_loss: 181488449.8675
Epoch 305/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 207434992.2566 - val_loss: 181485065.6677
Epoch 306/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 207431506.7682 - val_loss: 181481718.5688
Epoch 307/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 207428045.1313 - val_loss: 181478347.3761
Epoch 308/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 207424601.2566 - val_loss: 181475099.4332
Epoch 309/1000000
3921/3921 [==============================] - 0s 92us/step - loss: 207421123.6317 - val_loss: 181471656.3466
Epoch 310/1000000
3921/3921 [==============================] - 0s 108us/step - loss: 207417630.5708 - val_loss: 181468335.6412
Epoch 311/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 207414159.2165 - val_loss: 181464966.1448
Epoch 312/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 207410689.0324 - val_loss: 181461603.3884
Epoch 313/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 207407254.1597 - val_loss: 181458365.4475
Epoch 314/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 207403789.3313 - val_loss: 181454997.1621
Epoch 315/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 207400296.4795 - val_loss: 181451653.7125
Epoch 316/1000000
3921/3921 [==============================] - 0s 77us/step - loss: 207396860.4662 - val_loss: 181448311.8736
Epoch 317/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 207393361.1670 - val_loss: 181444879.8818
Epoch 318/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 207389857.6241 - val_loss: 181441676.9134
Epoch 319/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 207386429.1905 - val_loss: 181438223.1641
Epoch 320/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 207382913.1507 - val_loss: 181434867.1886
Epoch 321/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 207379454.8625 - val_loss: 181431486.3812
Epoch 322/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 207375964.5723 - val_loss: 181428186.9847
Epoch 323/1000000
3921/3921 [==============================] - 0s 100us/step - loss: 207372499.4884 - val_loss: 181424861.8430
Epoch 324/1000000
3921/3921 [==============================] - 0s 109us/step - loss: 207369049.0161 - val_loss: 181421483.2090
Epoch 325/1000000
3921/3921 [==============================] - 0s 118us/step - loss: 207365588.3866 - val_loss: 181418138.3649
Epoch 326/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 207362119.5955 - val_loss: 181414840.7503
Epoch 327/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 207358688.4978 - val_loss: 181411500.0856
Epoch 328/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 207355204.5295 - val_loss: 181408171.9388
Epoch 329/1000000
3921/3921 [==============================] - 0s 91us/step - loss: 207351747.4848 - val_loss: 181404800.3547
Epoch 330/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 207348269.8128 - val_loss: 181401458.5973
Epoch 331/1000000
3921/3921 [==============================] - 0s 93us/step - loss: 207344824.4917 - val_loss: 181398170.5117
Epoch 332/1000000
3921/3921 [==============================] - 0s 96us/step - loss: 207341359.7103 - val_loss: 181394784.0489
Epoch 333/1000000
3921/3921 [==============================] - 0s 95us/step - loss: 207337887.7378 - val_loss: 181391441.6391
Epoch 334/1000000
3921/3921 [==============================] - 0s 91us/step - loss: 207334438.5616 - val_loss: 181388147.8940
Epoch 335/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 207330977.3180 - val_loss: 181384767.7839
Epoch 336/1000000
3921/3921 [==============================] - 0s 109us/step - loss: 207327520.2081 - val_loss: 181381480.3425
Epoch 337/1000000
3921/3921 [==============================] - 1s 134us/step - loss: 207324071.2063 - val_loss: 181378091.0989
Epoch 338/1000000
3921/3921 [==============================] - 0s 105us/step - loss: 207320610.6565 - val_loss: 181374817.8797
Epoch 339/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 207317155.8194 - val_loss: 181371444.5505
Epoch 340/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 207313689.0671 - val_loss: 181368133.2762
Epoch 341/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 207310216.7692 - val_loss: 181364773.3007
Epoch 342/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 207306767.9388 - val_loss: 181361478.7278
Epoch 343/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 207303313.7424 - val_loss: 181358153.7166
Epoch 344/1000000
3921/3921 [==============================] - 0s 89us/step - loss: 207299869.1477 - val_loss: 181354859.7554
Epoch 345/1000000
3921/3921 [==============================] - 0s 91us/step - loss: 207296417.0941 - val_loss: 181351531.7839
Epoch 346/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 207293010.4586 - val_loss: 181348192.0285
Epoch 347/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 207289509.7924 - val_loss: 181344897.9327
Epoch 348/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 207286089.1568 - val_loss: 181341548.1305
Epoch 349/1000000
3921/3921 [==============================] - 0s 104us/step - loss: 207282626.3831 - val_loss: 181338192.1468
Epoch 350/1000000
3921/3921 [==============================] - 1s 138us/step - loss: 207279173.4272 - val_loss: 181334868.1753
Epoch 351/1000000
3921/3921 [==============================] - 0s 121us/step - loss: 207275721.1650 - val_loss: 181331564.8563
Epoch 352/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 207272267.1931 - val_loss: 181328233.5372
Epoch 353/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 207268812.8294 - val_loss: 181324861.2069
Epoch 354/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 207265364.5922 - val_loss: 181321545.6269
Epoch 355/1000000
3921/3921 [==============================] - 0s 92us/step - loss: 207261936.5182 - val_loss: 181318262.8787
Epoch 356/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 207258498.9768 - val_loss: 181314934.3445
Epoch 357/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 207255062.8350 - val_loss: 181311615.8491
Epoch 358/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 207251618.4433 - val_loss: 181308340.0612
Epoch 359/1000000
3921/3921 [==============================] - 0s 90us/step - loss: 207248198.1933 - val_loss: 181305020.5668
Epoch 360/1000000
3921/3921 [==============================] - 0s 90us/step - loss: 207244775.1900 - val_loss: 181301681.5454
Epoch 361/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 207241327.2614 - val_loss: 181298370.2752
Epoch 362/1000000
3921/3921 [==============================] - 0s 91us/step - loss: 207237889.9077 - val_loss: 181295095.6167
Epoch 363/1000000
3921/3921 [==============================] - 0s 100us/step - loss: 207234460.9804 - val_loss: 181291795.6045
Epoch 364/1000000
3921/3921 [==============================] - 0s 92us/step - loss: 207231019.6572 - val_loss: 181288464.5464
Epoch 365/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 207227633.4976 - val_loss: 181285189.9327
Epoch 366/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 207224198.6126 - val_loss: 181281929.4067
Epoch 367/1000000
3921/3921 [==============================] - 0s 91us/step - loss: 207220773.1579 - val_loss: 181278609.6065
Epoch 368/1000000
3921/3921 [==============================] - 0s 90us/step - loss: 207217372.5856 - val_loss: 181275309.9450
Epoch 369/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 207213914.1811 - val_loss: 181271952.9582
Epoch 370/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 207210484.6121 - val_loss: 181268635.1152
Epoch 371/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 207207053.2946 - val_loss: 181265467.5352
Epoch 372/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 207203619.3542 - val_loss: 181262019.4740
Epoch 373/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 207200220.1642 - val_loss: 181259066.0917
Epoch 374/1000000
3921/3921 [==============================] - 0s 96us/step - loss: 207196849.1691 - val_loss: 181255476.9419
Epoch 375/1000000
3921/3921 [==============================] - 0s 78us/step - loss: 207193377.3629 - val_loss: 181252152.2283
Epoch 376/1000000
3921/3921 [==============================] - 0s 102us/step - loss: 207189947.0584 - val_loss: 181248843.6901
Epoch 377/1000000
3921/3921 [==============================] - 0s 110us/step - loss: 207186544.3550 - val_loss: 181245555.0744
Epoch 378/1000000
3921/3921 [==============================] - 0s 125us/step - loss: 207183113.0630 - val_loss: 181242253.8430
Epoch 379/1000000
3921/3921 [==============================] - 0s 102us/step - loss: 207179680.0490 - val_loss: 181238957.7859
Epoch 380/1000000
3921/3921 [==============================] - 0s 91us/step - loss: 207176260.8865 - val_loss: 181235643.1193
Epoch 381/1000000
3921/3921 [==============================] - 0s 90us/step - loss: 207172865.1028 - val_loss: 181232363.5433
Epoch 382/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 207169440.4132 - val_loss: 181229071.0948
Epoch 383/1000000
3921/3921 [==============================] - 0s 64us/step - loss: 207166018.4830 - val_loss: 181225755.1641
Epoch 384/1000000
3921/3921 [==============================] - 0s 72us/step - loss: 207162569.8128 - val_loss: 181222448.2773
Epoch 385/1000000
3921/3921 [==============================] - 0s 57us/step - loss: 207159166.0168 - val_loss: 181219272.2569
Epoch 386/1000000
3921/3921 [==============================] - 0s 76us/step - loss: 207155745.5874 - val_loss: 181215944.4526
Epoch 387/1000000
3921/3921 [==============================] - 0s 97us/step - loss: 207152315.7496 - val_loss: 181212573.7166
Epoch 388/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 207148871.1574 - val_loss: 181209311.5392
Epoch 389/1000000
3921/3921 [==============================] - 0s 74us/step - loss: 207145486.5351 - val_loss: 181205981.3823
Epoch 390/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 207142034.5626 - val_loss: 181202714.4669
Epoch 391/1000000
3921/3921 [==============================] - 0s 100us/step - loss: 207138616.2020 - val_loss: 181199388.5749
Epoch 392/1000000
3921/3921 [==============================] - 0s 102us/step - loss: 207135196.8018 - val_loss: 181196042.4587
Epoch 393/1000000
3921/3921 [==============================] - 0s 104us/step - loss: 207131769.0385 - val_loss: 181192775.4985
Epoch 394/1000000
3921/3921 [==============================] - 0s 75us/step - loss: 207128364.0663 - val_loss: 181189475.4373
Epoch 395/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 207124948.0520 - val_loss: 181186218.9521
Epoch 396/1000000
3921/3921 [==============================] - 0s 65us/step - loss: 207121613.2578 - val_loss: 181183176.8073
Epoch 397/1000000
3921/3921 [==============================] - 0s 65us/step - loss: 207118249.6873 - val_loss: 181179723.5229
Epoch 398/1000000
3921/3921 [==============================] - 0s 59us/step - loss: 207114814.0806 - val_loss: 181176445.1662
Epoch 399/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 207111399.0900 - val_loss: 181173055.6412
Epoch 400/1000000
3921/3921 [==============================] - 0s 77us/step - loss: 207107942.7656 - val_loss: 181169865.8716
Epoch 401/1000000
3921/3921 [==============================] - 0s 53us/step - loss: 207104557.2415 - val_loss: 181166479.2253
Epoch 402/1000000
3921/3921 [==============================] - 0s 72us/step - loss: 207101068.3581 - val_loss: 181163252.7503
Epoch 403/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 207097707.7276 - val_loss: 181159993.5250
Epoch 404/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 207094275.7643 - val_loss: 181156624.9215
Epoch 405/1000000
3921/3921 [==============================] - 0s 98us/step - loss: 207090830.0699 - val_loss: 181153337.9083
Epoch 406/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 207087407.1308 - val_loss: 181150061.9001
Epoch 407/1000000
3921/3921 [==============================] - 0s 90us/step - loss: 207083989.0191 - val_loss: 181146757.7492
Epoch 408/1000000
3921/3921 [==============================] - 0s 96us/step - loss: 207080575.0859 - val_loss: 181143458.1651
Epoch 409/1000000
3921/3921 [==============================] - 0s 89us/step - loss: 207077140.3224 - val_loss: 181140153.0194
Epoch 410/1000000
3921/3921 [==============================] - 0s 55us/step - loss: 207073738.6218 - val_loss: 181136857.0031
Epoch 411/1000000
3921/3921 [==============================] - 0s 67us/step - loss: 207070337.2283 - val_loss: 181133610.8216
Epoch 412/1000000
3921/3921 [==============================] - 0s 61us/step - loss: 207066970.6422 - val_loss: 181130436.0204
Epoch 413/1000000
3921/3921 [==============================] - 0s 71us/step - loss: 207063540.1744 - val_loss: 181127069.5861
Epoch 414/1000000
3921/3921 [==============================] - 0s 100us/step - loss: 207060132.8865 - val_loss: 181123821.6310
Epoch 415/1000000
3921/3921 [==============================] - 0s 69us/step - loss: 207056735.0768 - val_loss: 181120483.8573
Epoch 416/1000000
3921/3921 [==============================] - 0s 76us/step - loss: 207053343.6588 - val_loss: 181117257.4720
Epoch 417/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 207049935.8572 - val_loss: 181113968.0612
Epoch 418/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 207046555.4950 - val_loss: 181110693.0887
Epoch 419/1000000
3921/3921 [==============================] - 0s 70us/step - loss: 207043163.1808 - val_loss: 181107398.2059
Epoch 420/1000000
3921/3921 [==============================] - 0s 66us/step - loss: 207039712.9406 - val_loss: 181104102.4506
Epoch 421/1000000
3921/3921 [==============================] - 0s 111us/step - loss: 207036323.5134 - val_loss: 181100844.8767
Epoch 422/1000000
3921/3921 [==============================] - 1s 132us/step - loss: 207032922.4126 - val_loss: 181097536.1590
Epoch 423/1000000
3921/3921 [==============================] - 0s 95us/step - loss: 207029538.7830 - val_loss: 181094253.8349
Epoch 424/1000000
3921/3921 [==============================] - 0s 97us/step - loss: 207026108.3948 - val_loss: 181091013.2681
Epoch 425/1000000
3921/3921 [==============================] - 0s 70us/step - loss: 207022723.2665 - val_loss: 181087739.7839
Epoch 426/1000000
3921/3921 [==============================] - 0s 68us/step - loss: 207019356.6376 - val_loss: 181084473.9409
Epoch 427/1000000
3921/3921 [==============================] - 0s 61us/step - loss: 207015929.7812 - val_loss: 181081215.8899
Epoch 428/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 207012518.4473 - val_loss: 181077892.6035
Epoch 429/1000000
3921/3921 [==============================] - 0s 65us/step - loss: 207009116.6702 - val_loss: 181074627.8532
Epoch 430/1000000
3921/3921 [==============================] - 0s 91us/step - loss: 207005716.6886 - val_loss: 181071325.6595
Epoch 431/1000000
3921/3921 [==============================] - 0s 55us/step - loss: 207002306.0066 - val_loss: 181068088.1346
Epoch 432/1000000
3921/3921 [==============================] - 0s 77us/step - loss: 206998923.6623 - val_loss: 181064786.8950
Epoch 433/1000000
3921/3921 [==============================] - 0s 58us/step - loss: 206995531.5766 - val_loss: 181061556.7217
Epoch 434/1000000
3921/3921 [==============================] - 0s 65us/step - loss: 206992158.2882 - val_loss: 181058252.9541
Epoch 435/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 206988757.6027 - val_loss: 181054990.7727
Epoch 436/1000000
3921/3921 [==============================] - 0s 94us/step - loss: 206985348.3234 - val_loss: 181051725.4108
Epoch 437/1000000
3921/3921 [==============================] - 1s 128us/step - loss: 206981962.0791 - val_loss: 181048416.3914
Epoch 438/1000000
3921/3921 [==============================] - 0s 125us/step - loss: 206978568.0653 - val_loss: 181045207.0051
Epoch 439/1000000
3921/3921 [==============================] - 0s 116us/step - loss: 206975189.3986 - val_loss: 181041937.3374
Epoch 440/1000000
3921/3921 [==============================] - 0s 99us/step - loss: 206971760.5458 - val_loss: 181038623.0540
Epoch 441/1000000
3921/3921 [==============================] - 0s 95us/step - loss: 206968416.4346 - val_loss: 181035446.2875
Epoch 442/1000000
3921/3921 [==============================] - 0s 105us/step - loss: 206965076.6580 - val_loss: 181032192.4037
Epoch 443/1000000
3921/3921 [==============================] - 0s 112us/step - loss: 206961715.1869 - val_loss: 181028906.2508
Epoch 444/1000000
3921/3921 [==============================] - 0s 107us/step - loss: 206958328.6060 - val_loss: 181025645.9776
Epoch 445/1000000
3921/3921 [==============================] - 0s 98us/step - loss: 206954951.1900 - val_loss: 181022430.7564
Epoch 446/1000000
3921/3921 [==============================] - 0s 96us/step - loss: 206951549.5353 - val_loss: 181019142.7482
Epoch 447/1000000
3921/3921 [==============================] - 0s 96us/step - loss: 206948144.1938 - val_loss: 181015875.2130
Epoch 448/1000000
3921/3921 [==============================] - 0s 113us/step - loss: 206944757.4884 - val_loss: 181012609.8471
Epoch 449/1000000
3921/3921 [==============================] - 0s 107us/step - loss: 206941351.8235 - val_loss: 181009331.7880
Epoch 450/1000000
3921/3921 [==============================] - 0s 115us/step - loss: 206938011.9276 - val_loss: 181006060.4241
Epoch 451/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 206934620.0469 - val_loss: 181002791.2783
Epoch 452/1000000
3921/3921 [==============================] - 0s 66us/step - loss: 206931224.6019 - val_loss: 180999625.0805
Epoch 453/1000000
3921/3921 [==============================] - 0s 59us/step - loss: 206927837.7598 - val_loss: 180996260.2936
Epoch 454/1000000
3921/3921 [==============================] - 0s 68us/step - loss: 206924494.3963 - val_loss: 180993087.7880
Epoch 455/1000000
3921/3921 [==============================] - 0s 53us/step - loss: 206921043.5950 - val_loss: 180989685.1621
Epoch 456/1000000
3921/3921 [==============================] - 0s 63us/step - loss: 206917694.9635 - val_loss: 180986538.3160
Epoch 457/1000000
3921/3921 [==============================] - 0s 59us/step - loss: 206914313.0263 - val_loss: 180983291.8287
Epoch 458/1000000
3921/3921 [==============================] - 0s 69us/step - loss: 206910935.2431 - val_loss: 180980020.1590
Epoch 459/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 206907556.4315 - val_loss: 180976820.0408
Epoch 460/1000000
3921/3921 [==============================] - 0s 90us/step - loss: 206904207.4053 - val_loss: 180973557.7166
Epoch 461/1000000
3921/3921 [==============================] - 0s 93us/step - loss: 206900837.1721 - val_loss: 180970302.0877
Epoch 462/1000000
3921/3921 [==============================] - 0s 95us/step - loss: 206897466.9972 - val_loss: 180967004.5423
Epoch 463/1000000
3921/3921 [==============================] - 0s 94us/step - loss: 206894068.0112 - val_loss: 180963762.0958
Epoch 464/1000000
3921/3921 [==============================] - 0s 104us/step - loss: 206890701.7598 - val_loss: 180960503.7431
Epoch 465/1000000
3921/3921 [==============================] - 1s 132us/step - loss: 206887324.4639 - val_loss: 180957243.4699
Epoch 466/1000000
3921/3921 [==============================] - 0s 103us/step - loss: 206883973.4945 - val_loss: 180954070.4791
Epoch 467/1000000
3921/3921 [==============================] - 0s 96us/step - loss: 206880648.2377 - val_loss: 180950821.0316
Epoch 468/1000000
3921/3921 [==============================] - 0s 101us/step - loss: 206877208.0184 - val_loss: 180947485.2110
Epoch 469/1000000
3921/3921 [==============================] - 0s 90us/step - loss: 206873852.5111 - val_loss: 180944316.9704
Epoch 470/1000000
3921/3921 [==============================] - 0s 98us/step - loss: 206870522.1974 - val_loss: 180940975.1030
Epoch 471/1000000
3921/3921 [==============================] - 0s 97us/step - loss: 206867080.0592 - val_loss: 180937711.1315
Epoch 472/1000000
3921/3921 [==============================] - 0s 96us/step - loss: 206863652.2479 - val_loss: 180934510.7849
Epoch 473/1000000
3921/3921 [==============================] - 0s 95us/step - loss: 206860323.4685 - val_loss: 180931269.6922
Epoch 474/1000000
3921/3921 [==============================] - 0s 96us/step - loss: 206856940.3275 - val_loss: 180928024.0285
Epoch 475/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 206853520.8039 - val_loss: 180924710.2181
Epoch 476/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 206850157.8659 - val_loss: 180921395.9674
Epoch 477/1000000
3921/3921 [==============================] - 1s 128us/step - loss: 206846778.1413 - val_loss: 180918347.0214
Epoch 478/1000000
3921/3921 [==============================] - 1s 144us/step - loss: 206843462.3657 - val_loss: 180915036.0122
Epoch 479/1000000
3921/3921 [==============================] - 0s 104us/step - loss: 206840071.1166 - val_loss: 180911758.9643
Epoch 480/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 206836711.0972 - val_loss: 180908560.0571
Epoch 481/1000000
3921/3921 [==============================] - 0s 102us/step - loss: 206833333.9964 - val_loss: 180905225.1458
Epoch 482/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 206829943.1370 - val_loss: 180902028.0163
Epoch 483/1000000
3921/3921 [==============================] - 0s 95us/step - loss: 206826597.4435 - val_loss: 180898769.8267
Epoch 484/1000000
3921/3921 [==============================] - 0s 89us/step - loss: 206823235.4767 - val_loss: 180895488.7992
Epoch 485/1000000
3921/3921 [==============================] - 0s 93us/step - loss: 206819871.2675 - val_loss: 180892276.9297
Epoch 486/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 206816550.1497 - val_loss: 180889196.5790
Epoch 487/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 206813177.3242 - val_loss: 180885787.9021
Epoch 488/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 206809830.2137 - val_loss: 180882595.8614
Epoch 489/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 206806465.2160 - val_loss: 180879325.5331
Epoch 490/1000000
3921/3921 [==============================] - 0s 105us/step - loss: 206803102.2943 - val_loss: 180876084.2161
Epoch 491/1000000
3921/3921 [==============================] - 1s 129us/step - loss: 206799766.8477 - val_loss: 180872893.2151
Epoch 492/1000000
3921/3921 [==============================] - 0s 102us/step - loss: 206796406.2392 - val_loss: 180869609.9776
Epoch 493/1000000
3921/3921 [==============================] - 0s 98us/step - loss: 206793093.2028 - val_loss: 180866532.6198
Epoch 494/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 206789756.6039 - val_loss: 180863269.2110
Epoch 495/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 206786368.0326 - val_loss: 180860013.1009
Epoch 496/1000000
3921/3921 [==============================] - 0s 94us/step - loss: 206783010.2892 - val_loss: 180856806.4016
Epoch 497/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 206779673.7077 - val_loss: 180853615.8410
Epoch 498/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 206776353.2895 - val_loss: 180850320.8073
Epoch 499/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 206773009.9260 - val_loss: 180847123.8124
Epoch 500/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 206769663.2675 - val_loss: 180843922.2834
Epoch 501/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 206766297.5853 - val_loss: 180840697.7574
Epoch 502/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 206762954.6544 - val_loss: 180837489.8838
Epoch 503/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 206759608.1979 - val_loss: 180834249.5657
Epoch 504/1000000
3921/3921 [==============================] - 0s 127us/step - loss: 206756259.3746 - val_loss: 180831102.7074
Epoch 505/1000000
3921/3921 [==============================] - 1s 135us/step - loss: 206752944.7070 - val_loss: 180827834.2100
Epoch 506/1000000
3921/3921 [==============================] - 0s 105us/step - loss: 206749566.8778 - val_loss: 180824585.7982
Epoch 507/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 206746222.0403 - val_loss: 180821375.8369
Epoch 508/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 206742886.7575 - val_loss: 180818142.6952
Epoch 509/1000000
3921/3921 [==============================] - 0s 93us/step - loss: 206739533.4721 - val_loss: 180814944.2569
Epoch 510/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 206736194.5565 - val_loss: 180811719.8573
Epoch 511/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 206732845.1783 - val_loss: 180808512.7217
Epoch 512/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 206729626.0944 - val_loss: 180805553.4149
Epoch 513/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 206726496.7059 - val_loss: 180802191.0092
Epoch 514/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 206723054.8330 - val_loss: 180799009.1825
Epoch 515/1000000
3921/3921 [==============================] - 0s 97us/step - loss: 206719689.0094 - val_loss: 180795720.0245
Epoch 516/1000000
3921/3921 [==============================] - 0s 90us/step - loss: 206716385.0283 - val_loss: 180792500.4404
Epoch 517/1000000
3921/3921 [==============================] - 0s 99us/step - loss: 206713010.1770 - val_loss: 180789320.4526
Epoch 518/1000000
3921/3921 [==============================] - 0s 122us/step - loss: 206709654.7452 - val_loss: 180786132.7136
Epoch 519/1000000
3921/3921 [==============================] - 0s 118us/step - loss: 206706296.9426 - val_loss: 180782969.0683
Epoch 520/1000000
3921/3921 [==============================] - 0s 92us/step - loss: 206703139.6572 - val_loss: 180779627.3639
Epoch 521/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 206699689.8016 - val_loss: 180776589.1865
Epoch 522/1000000
3921/3921 [==============================] - 0s 89us/step - loss: 206696267.5073 - val_loss: 180773120.2732
Epoch 523/1000000
3921/3921 [==============================] - 0s 90us/step - loss: 206692824.7937 - val_loss: 180769905.6147
Epoch 524/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 206689473.6394 - val_loss: 180766682.1692
Epoch 525/1000000
3921/3921 [==============================] - 0s 94us/step - loss: 206686120.0551 - val_loss: 180763475.1193
Epoch 526/1000000
3921/3921 [==============================] - 0s 93us/step - loss: 206683114.7993 - val_loss: 180760642.9725
Epoch 527/1000000
3921/3921 [==============================] - 0s 75us/step - loss: 206679681.8281 - val_loss: 180757058.4139
Epoch 528/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 206676150.8513 - val_loss: 180753860.9337
Epoch 529/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 206672793.6914 - val_loss: 180750531.7554
Epoch 530/1000000
3921/3921 [==============================] - 0s 95us/step - loss: 206669426.8625 - val_loss: 180747270.1692
Epoch 531/1000000
3921/3921 [==============================] - 1s 128us/step - loss: 206666092.9722 - val_loss: 180744144.3629
Epoch 532/1000000
3921/3921 [==============================] - 1s 129us/step - loss: 206662771.7950 - val_loss: 180740952.4893
Epoch 533/1000000
3921/3921 [==============================] - 0s 100us/step - loss: 206659419.0321 - val_loss: 180737718.7768
Epoch 534/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 206656058.5810 - val_loss: 180734475.0622
Epoch 535/1000000
3921/3921 [==============================] - 0s 96us/step - loss: 206652795.1686 - val_loss: 180731413.1050
Epoch 536/1000000
3921/3921 [==============================] - 0s 91us/step - loss: 206649462.4392 - val_loss: 180728134.3405
Epoch 537/1000000
3921/3921 [==============================] - 0s 92us/step - loss: 206646121.2915 - val_loss: 180724936.1631
Epoch 538/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 206642769.5547 - val_loss: 180721687.7064
Epoch 539/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 206639446.1331 - val_loss: 180718527.5392
Epoch 540/1000000
3921/3921 [==============================] - 0s 89us/step - loss: 206636096.6345 - val_loss: 180715309.3986
Epoch 541/1000000
3921/3921 [==============================] - 0s 92us/step - loss: 206632759.1206 - val_loss: 180712221.1295
Epoch 542/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 206629449.6792 - val_loss: 180708862.7238
Epoch 543/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 206626037.1742 - val_loss: 180705610.2263
Epoch 544/1000000
3921/3921 [==============================] - 0s 103us/step - loss: 206622692.3831 - val_loss: 180702385.0357
Epoch 545/1000000
3921/3921 [==============================] - 1s 130us/step - loss: 206619364.8335 - val_loss: 180699170.5484
Epoch 546/1000000
3921/3921 [==============================] - 0s 113us/step - loss: 206616076.4376 - val_loss: 180695971.4577
Epoch 547/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 206612734.7024 - val_loss: 180692841.2069
Epoch 548/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 206609396.5815 - val_loss: 180689479.2008
Epoch 549/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 206606066.4524 - val_loss: 180686332.3792
Epoch 550/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 206602712.3203 - val_loss: 180683129.9001
Epoch 551/1000000
3921/3921 [==============================] - 0s 89us/step - loss: 206599483.7807 - val_loss: 180680158.3323
Epoch 552/1000000
3921/3921 [==============================] - 0s 91us/step - loss: 206596234.0852 - val_loss: 180676766.4220
Epoch 553/1000000
3921/3921 [==============================] - 0s 95us/step - loss: 206592761.4262 - val_loss: 180673574.0754
Epoch 554/1000000
3921/3921 [==============================] - 0s 90us/step - loss: 206589404.7070 - val_loss: 180670332.2243
Epoch 555/1000000
3921/3921 [==============================] - 0s 79us/step - loss: 206586235.7399 - val_loss: 180667266.6137
Epoch 556/1000000
3921/3921 [==============================] - 0s 89us/step - loss: 206582904.4754 - val_loss: 180663975.4455
Epoch 557/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 206579546.3769 - val_loss: 180660816.6646
Epoch 558/1000000
3921/3921 [==============================] - 1s 132us/step - loss: 206576122.6381 - val_loss: 180657547.2457
Epoch 559/1000000
3921/3921 [==============================] - 1s 151us/step - loss: 206572957.3803 - val_loss: 180654367.0296
Epoch 560/1000000
3921/3921 [==============================] - 0s 112us/step - loss: 206569487.1839 - val_loss: 180651072.6891
Epoch 561/1000000
3921/3921 [==============================] - 0s 98us/step - loss: 206566108.8539 - val_loss: 180647943.3109
Epoch 562/1000000
3921/3921 [==============================] - 0s 94us/step - loss: 206562743.5164 - val_loss: 180644601.4720
Epoch 563/1000000
3921/3921 [==============================] - 0s 107us/step - loss: 206559425.3609 - val_loss: 180641397.9409
Epoch 564/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 206556100.3662 - val_loss: 180638254.4709
Epoch 565/1000000
3921/3921 [==============================] - 0s 94us/step - loss: 206552761.3405 - val_loss: 180634931.6412
Epoch 566/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 206549380.6600 - val_loss: 180631786.3486
Epoch 567/1000000
3921/3921 [==============================] - 0s 70us/step - loss: 206546113.8363 - val_loss: 180628551.1519
Epoch 568/1000000
3921/3921 [==============================] - 0s 79us/step - loss: 206542770.5014 - val_loss: 180625582.2263
Epoch 569/1000000
3921/3921 [==============================] - 0s 79us/step - loss: 206539607.5532 - val_loss: 180622231.3843
Epoch 570/1000000
3921/3921 [==============================] - 0s 77us/step - loss: 206536151.8021 - val_loss: 180619010.2426
Epoch 571/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 206532864.0495 - val_loss: 180615950.1896
Epoch 572/1000000
3921/3921 [==============================] - 0s 124us/step - loss: 206529579.1115 - val_loss: 180612619.7023
Epoch 573/1000000
3921/3921 [==============================] - 0s 107us/step - loss: 206526217.9403 - val_loss: 180609444.4404
Epoch 574/1000000
3921/3921 [==============================] - 0s 78us/step - loss: 206522932.0337 - val_loss: 180606212.5912
Epoch 575/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 206519634.2770 - val_loss: 180603021.1498
Epoch 576/1000000
3921/3921 [==============================] - 0s 72us/step - loss: 206516319.2737 - val_loss: 180599897.3374
Epoch 577/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 206513064.2265 - val_loss: 180596732.2446
Epoch 578/1000000
3921/3921 [==============================] - 0s 75us/step - loss: 206509687.9123 - val_loss: 180593525.8471
Epoch 579/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 206506328.3372 - val_loss: 180590306.5280
Epoch 580/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 206503027.1257 - val_loss: 180587069.0724
Epoch 581/1000000
3921/3921 [==============================] - 0s 75us/step - loss: 206499831.2798 - val_loss: 180584343.7431
Epoch 582/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 206496717.5863 - val_loss: 180581074.8705
Epoch 583/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 206493469.8087 - val_loss: 180577946.2385
Epoch 584/1000000
3921/3921 [==============================] - 0s 90us/step - loss: 206490092.5193 - val_loss: 180574492.9664
Epoch 585/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 206486583.5369 - val_loss: 180571208.7136
Epoch 586/1000000
3921/3921 [==============================] - 0s 111us/step - loss: 206483306.9503 - val_loss: 180568142.5729
Epoch 587/1000000
3921/3921 [==============================] - 1s 128us/step - loss: 206480001.0283 - val_loss: 180564783.5107
Epoch 588/1000000
3921/3921 [==============================] - 0s 94us/step - loss: 206476525.5802 - val_loss: 180561511.6942
Epoch 589/1000000
3921/3921 [==============================] - 0s 77us/step - loss: 206473257.8710 - val_loss: 180558519.3598
Epoch 590/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 206469911.0921 - val_loss: 180555135.7227
Epoch 591/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 206466588.0479 - val_loss: 180551954.6748
Epoch 592/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 206463281.3690 - val_loss: 180548761.6636
Epoch 593/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 206459914.8258 - val_loss: 180545574.9195
Epoch 594/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 206456595.4195 - val_loss: 180542362.8624
Epoch 595/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 206453293.0252 - val_loss: 180539204.0815
Epoch 596/1000000
3921/3921 [==============================] - 0s 96us/step - loss: 206450021.8516 - val_loss: 180536003.9878
Epoch 597/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 206446739.5991 - val_loss: 180532815.2375
Epoch 598/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 206443366.1290 - val_loss: 180529673.3782
Epoch 599/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 206440079.2362 - val_loss: 180526485.1498
Epoch 600/1000000
3921/3921 [==============================] - 0s 104us/step - loss: 206436798.3678 - val_loss: 180523531.3925
Epoch 601/1000000
3921/3921 [==============================] - 0s 109us/step - loss: 206433501.6414 - val_loss: 180520155.7105
Epoch 602/1000000
3921/3921 [==============================] - 0s 91us/step - loss: 206430198.3433 - val_loss: 180516889.5494
Epoch 603/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 206426837.2395 - val_loss: 180513712.0204
Epoch 604/1000000
3921/3921 [==============================] - 0s 76us/step - loss: 206423522.4912 - val_loss: 180510538.1488
Epoch 605/1000000
3921/3921 [==============================] - 0s 89us/step - loss: 206420258.7177 - val_loss: 180507361.3537
Epoch 606/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 206417070.6004 - val_loss: 180504241.9857
Epoch 607/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 206413676.5203 - val_loss: 180501005.6065
Epoch 608/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 206410320.9997 - val_loss: 180497847.8247
Epoch 609/1000000
3921/3921 [==============================] - 0s 89us/step - loss: 206407116.2765 - val_loss: 180494697.7003
Epoch 610/1000000
3921/3921 [==============================] - 0s 73us/step - loss: 206403788.1112 - val_loss: 180491513.9939
Epoch 611/1000000
3921/3921 [==============================] - 0s 75us/step - loss: 206400435.7378 - val_loss: 180488255.5311
Epoch 612/1000000
3921/3921 [==============================] - 0s 75us/step - loss: 206397065.5731 - val_loss: 180485041.1621
Epoch 613/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 206393856.8080 - val_loss: 180481963.1927
Epoch 614/1000000
3921/3921 [==============================] - 0s 98us/step - loss: 206390553.8791 - val_loss: 180478810.6707
Epoch 615/1000000
3921/3921 [==============================] - 0s 103us/step - loss: 206387214.9105 - val_loss: 180475529.1131
Epoch 616/1000000
3921/3921 [==============================] - 0s 96us/step - loss: 206383916.7886 - val_loss: 180472375.1967
Epoch 617/1000000
3921/3921 [==============================] - 0s 73us/step - loss: 206380596.1540 - val_loss: 180469229.7737
Epoch 618/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 206377396.2969 - val_loss: 180466044.3670
Epoch 619/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 206374031.4132 - val_loss: 180462841.8756
Epoch 620/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 206370801.8607 - val_loss: 180459763.9837
Epoch 621/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 206367633.0079 - val_loss: 180456582.6340
Epoch 622/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 206364360.9365 - val_loss: 180453332.5178
Epoch 623/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 206360784.0041 - val_loss: 180450148.5056
Epoch 624/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 206357420.7967 - val_loss: 180446891.4332
Epoch 625/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 206354112.9467 - val_loss: 180443747.0010
Epoch 626/1000000
3921/3921 [==============================] - 0s 76us/step - loss: 206350809.3109 - val_loss: 180440560.1223
Epoch 627/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 206347522.7748 - val_loss: 180437393.2436
Epoch 628/1000000
3921/3921 [==============================] - 0s 90us/step - loss: 206344180.0316 - val_loss: 180434184.6198
Epoch 629/1000000
3921/3921 [==============================] - 0s 97us/step - loss: 206340865.9750 - val_loss: 180430944.9827
Epoch 630/1000000
3921/3921 [==============================] - 0s 97us/step - loss: 206337566.5891 - val_loss: 180427787.0703
Epoch 631/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 206334259.7582 - val_loss: 180424585.6636
Epoch 632/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 206330969.5200 - val_loss: 180421368.0367
Epoch 633/1000000
3921/3921 [==============================] - 0s 89us/step - loss: 206327733.4598 - val_loss: 180418581.1580
Epoch 634/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 206324813.2864 - val_loss: 180415240.7788
Epoch 635/1000000
3921/3921 [==============================] - 0s 76us/step - loss: 206321163.0972 - val_loss: 180411959.9592
Epoch 636/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 206317832.2265 - val_loss: 180408757.4679
Epoch 637/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 206314524.3520 - val_loss: 180405565.4516
Epoch 638/1000000
3921/3921 [==============================] - 0s 89us/step - loss: 206311334.4259 - val_loss: 180402456.1590
Epoch 639/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 206308179.6307 - val_loss: 180399312.7747
Epoch 640/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 206304809.7975 - val_loss: 180396187.9062
Epoch 641/1000000
3921/3921 [==============================] - 0s 89us/step - loss: 206301456.9895 - val_loss: 180393165.8675
Epoch 642/1000000
3921/3921 [==============================] - 0s 96us/step - loss: 206298268.8579 - val_loss: 180389872.7747
Epoch 643/1000000
3921/3921 [==============================] - 0s 107us/step - loss: 206294852.4366 - val_loss: 180386591.8165
Epoch 644/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 206291570.5340 - val_loss: 180383476.0897
Epoch 645/1000000
3921/3921 [==============================] - 0s 73us/step - loss: 206288266.1627 - val_loss: 180380282.5076
Epoch 646/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 206285024.2612 - val_loss: 180377098.4098
Epoch 647/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 206281690.8840 - val_loss: 180373942.8420
Epoch 648/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 206278408.4529 - val_loss: 180370723.3394
Epoch 649/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 206275138.1015 - val_loss: 180367616.3996
Epoch 650/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 206272077.9148 - val_loss: 180364629.9735
Epoch 651/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 206268626.8319 - val_loss: 180361308.4771
Epoch 652/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 206265341.4170 - val_loss: 180358195.1845
Epoch 653/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 206262091.1237 - val_loss: 180355395.2171
Epoch 654/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 206258903.5450 - val_loss: 180351935.7635
Epoch 655/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 206255553.5894 - val_loss: 180348670.7238
Epoch 656/1000000
3921/3921 [==============================] - 0s 96us/step - loss: 206252140.3152 - val_loss: 180345489.8838
Epoch 657/1000000
3921/3921 [==============================] - 0s 112us/step - loss: 206248830.2698 - val_loss: 180342339.7105
Epoch 658/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 206245608.7467 - val_loss: 180339184.7462
Epoch 659/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 206242257.2925 - val_loss: 180335960.0693
Epoch 660/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 206238974.6065 - val_loss: 180332944.0285
Epoch 661/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 206235854.1801 - val_loss: 180329917.1539
Epoch 662/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 206232689.4037 - val_loss: 180326878.3160
Epoch 663/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 206229413.1987 - val_loss: 180323672.0326
Epoch 664/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 206226090.1648 - val_loss: 180320363.2416
Epoch 665/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 206222712.6162 - val_loss: 180317063.7961
Epoch 666/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 206219333.2925 - val_loss: 180313913.0071
Epoch 667/1000000
3921/3921 [==============================] - 0s 69us/step - loss: 206216065.2323 - val_loss: 180310925.9776
Epoch 668/1000000
3921/3921 [==============================] - 0s 73us/step - loss: 206213032.8549 - val_loss: 180307797.3211
Epoch 669/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 206209598.0984 - val_loss: 180304554.1529
Epoch 670/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 206206287.7340 - val_loss: 180301418.1978
Epoch 671/1000000
3921/3921 [==============================] - 0s 103us/step - loss: 206202989.3048 - val_loss: 180298166.1162
Epoch 672/1000000
3921/3921 [==============================] - 0s 100us/step - loss: 206199793.4068 - val_loss: 180295380.4200
Epoch 673/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 206196742.3943 - val_loss: 180291969.5698
Epoch 674/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 206193261.2701 - val_loss: 180288787.8124
Epoch 675/1000000
3921/3921 [==============================] - 0s 91us/step - loss: 206190078.6269 - val_loss: 180285633.3333
Epoch 676/1000000
3921/3921 [==============================] - 0s 90us/step - loss: 206186705.8730 - val_loss: 180282493.3700
Epoch 677/1000000
3921/3921 [==============================] - 0s 89us/step - loss: 206183401.4976 - val_loss: 180279347.7105
Epoch 678/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 206180174.4596 - val_loss: 180276205.4883
Epoch 679/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 206177055.3706 - val_loss: 180273294.3894
Epoch 680/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 206173820.0071 - val_loss: 180270081.5372
Epoch 681/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 206170457.6424 - val_loss: 180266789.7044
Epoch 682/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 206167079.5736 - val_loss: 180263672.6646
Epoch 683/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 206163802.2341 - val_loss: 180260533.2722
Epoch 684/1000000
3921/3921 [==============================] - 0s 92us/step - loss: 206160602.9809 - val_loss: 180257591.0744
Epoch 685/1000000
3921/3921 [==============================] - 0s 106us/step - loss: 206157496.4672 - val_loss: 180254299.4577
Epoch 686/1000000
3921/3921 [==============================] - 0s 89us/step - loss: 206154092.6458 - val_loss: 180251085.5168
Epoch 687/1000000
3921/3921 [==============================] - 0s 77us/step - loss: 206150851.0686 - val_loss: 180248142.2630
Epoch 688/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 206147715.7154 - val_loss: 180245080.6850
Epoch 689/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 206144440.9263 - val_loss: 180241778.9195
Epoch 690/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 206141096.8447 - val_loss: 180238522.5810
Epoch 691/1000000
3921/3921 [==============================] - 0s 90us/step - loss: 206137696.2836 - val_loss: 180235851.3884
Epoch 692/1000000
3921/3921 [==============================] - 0s 72us/step - loss: 206134662.5779 - val_loss: 180232322.0836
Epoch 693/1000000
3921/3921 [==============================] - 0s 95us/step - loss: 206131243.1145 - val_loss: 180229047.0826
Epoch 694/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 206127870.5213 - val_loss: 180225918.6871
Epoch 695/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 206124619.2584 - val_loss: 180222779.9021
Epoch 696/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 206121368.6519 - val_loss: 180219642.3812
Epoch 697/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 206118078.5310 - val_loss: 180216563.3028
Epoch 698/1000000
3921/3921 [==============================] - 0s 93us/step - loss: 206114799.9918 - val_loss: 180213370.6748
Epoch 699/1000000
3921/3921 [==============================] - 0s 109us/step - loss: 206111521.5098 - val_loss: 180210116.5097
Epoch 700/1000000
3921/3921 [==============================] - 0s 116us/step - loss: 206108254.4667 - val_loss: 180207057.7900
Epoch 701/1000000
3921/3921 [==============================] - 0s 89us/step - loss: 206105019.8118 - val_loss: 180203903.9592
Epoch 702/1000000
3921/3921 [==============================] - 0s 94us/step - loss: 206101781.6047 - val_loss: 180200716.0204
Epoch 703/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 206098512.5866 - val_loss: 180197579.5800
Epoch 704/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 206095660.8294 - val_loss: 180195032.7339
Epoch 705/1000000
3921/3921 [==============================] - 0s 90us/step - loss: 206092225.0610 - val_loss: 180191417.3945
Epoch 706/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 206088820.2724 - val_loss: 180188333.9286
Epoch 707/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 206085514.7238 - val_loss: 180185419.9062
Epoch 708/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 206082330.9809 - val_loss: 180182064.9378
Epoch 709/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 206079061.8108 - val_loss: 180178843.9633
Epoch 710/1000000
3921/3921 [==============================] - 0s 75us/step - loss: 206075947.8806 - val_loss: 180175662.2222
Epoch 711/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 206072448.9957 - val_loss: 180172551.1437
Epoch 712/1000000
3921/3921 [==============================] - 0s 102us/step - loss: 206069194.1811 - val_loss: 180169373.6432
Epoch 713/1000000
3921/3921 [==============================] - 0s 123us/step - loss: 206065939.2930 - val_loss: 180166313.0968
Epoch 714/1000000
3921/3921 [==============================] - 0s 98us/step - loss: 206062652.7682 - val_loss: 180163091.5719
Epoch 715/1000000
3921/3921 [==============================] - 0s 79us/step - loss: 206059404.7967 - val_loss: 180159942.7482
Epoch 716/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 206056108.9732 - val_loss: 180156848.3670
Epoch 717/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 206052924.9314 - val_loss: 180153729.6677
Epoch 718/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 206049636.6600 - val_loss: 180150528.1223
Epoch 719/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 206046394.4504 - val_loss: 180147381.3293
Epoch 720/1000000
3921/3921 [==============================] - 0s 96us/step - loss: 206043190.9737 - val_loss: 180144268.9419
Epoch 721/1000000
3921/3921 [==============================] - 0s 94us/step - loss: 206039933.1252 - val_loss: 180141251.1967
Epoch 722/1000000
3921/3921 [==============================] - 0s 92us/step - loss: 206036714.1933 - val_loss: 180138135.7187
Epoch 723/1000000
3921/3921 [==============================] - 0s 93us/step - loss: 206033380.3336 - val_loss: 180134895.4169
Epoch 724/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 206030096.8243 - val_loss: 180131691.3476
Epoch 725/1000000
3921/3921 [==============================] - 0s 98us/step - loss: 206026809.9383 - val_loss: 180128534.3364
Epoch 726/1000000
3921/3921 [==============================] - 0s 116us/step - loss: 206023561.2130 - val_loss: 180125537.1172
Epoch 727/1000000
3921/3921 [==============================] - 0s 103us/step - loss: 206020397.6822 - val_loss: 180122645.1213
Epoch 728/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 206017211.3563 - val_loss: 180119398.0632
Epoch 729/1000000
3921/3921 [==============================] - 0s 75us/step - loss: 206013866.3198 - val_loss: 180116031.0173
Epoch 730/1000000
3921/3921 [==============================] - 0s 75us/step - loss: 206010579.3344 - val_loss: 180112969.9939
Epoch 731/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 206007437.1885 - val_loss: 180109958.7645
Epoch 732/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 206004093.9862 - val_loss: 180106586.9032
Epoch 733/1000000
3921/3921 [==============================] - 0s 90us/step - loss: 206000782.0984 - val_loss: 180103487.8206
Epoch 734/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205997528.4907 - val_loss: 180100341.3293
Epoch 735/1000000
3921/3921 [==============================] - 0s 93us/step - loss: 205994572.7110 - val_loss: 180097614.7115
Epoch 736/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 205991175.7858 - val_loss: 180094194.7890
Epoch 737/1000000
3921/3921 [==============================] - 0s 90us/step - loss: 205987912.5998 - val_loss: 180091143.5923
Epoch 738/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 205984740.0632 - val_loss: 180088053.9490
Epoch 739/1000000
3921/3921 [==============================] - 0s 102us/step - loss: 205981509.4088 - val_loss: 180084868.1835
Epoch 740/1000000
3921/3921 [==============================] - 0s 114us/step - loss: 205978170.1035 - val_loss: 180081703.6901
Epoch 741/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 205974927.6287 - val_loss: 180078700.4648
Epoch 742/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 205971711.8409 - val_loss: 180075521.5739
Epoch 743/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 205968500.9906 - val_loss: 180072403.6534
Epoch 744/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 205965273.1507 - val_loss: 180069270.8257
Epoch 745/1000000
3921/3921 [==============================] - 0s 89us/step - loss: 205962447.4410 - val_loss: 180066613.5209
Epoch 746/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 205958768.0408 - val_loss: 180063142.4506
Epoch 747/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205955482.7687 - val_loss: 180059988.8400
Epoch 748/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 205952253.2415 - val_loss: 180056904.1957
Epoch 749/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 205948974.6901 - val_loss: 180053767.2742
Epoch 750/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205945723.1359 - val_loss: 180050721.1254
Epoch 751/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 205942506.3157 - val_loss: 180047466.3731
Epoch 752/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 205939283.5460 - val_loss: 180044238.9439
Epoch 753/1000000
3921/3921 [==============================] - 0s 94us/step - loss: 205936000.6447 - val_loss: 180041273.5535
Epoch 754/1000000
3921/3921 [==============================] - 0s 98us/step - loss: 205932814.4453 - val_loss: 180038145.9450
Epoch 755/1000000
3921/3921 [==============================] - 0s 91us/step - loss: 205929587.8888 - val_loss: 180035078.7849
Epoch 756/1000000
3921/3921 [==============================] - 0s 71us/step - loss: 205926463.8368 - val_loss: 180033630.7604
Epoch 757/1000000
3921/3921 [==============================] - 0s 79us/step - loss: 205923731.4726 - val_loss: 180028955.2457
Epoch 758/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 205919957.9699 - val_loss: 180025613.8634
Epoch 759/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 205916880.9280 - val_loss: 180023182.6177
Epoch 760/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 205913616.8875 - val_loss: 180019393.2518
Epoch 761/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 205910280.7345 - val_loss: 180016369.5372
Epoch 762/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 205906995.1012 - val_loss: 180013265.5454
Epoch 763/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 205903744.5794 - val_loss: 180010120.4404
Epoch 764/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 205900602.6677 - val_loss: 180007032.5301
Epoch 765/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 205897238.4871 - val_loss: 180003888.9541
Epoch 766/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 205894075.1278 - val_loss: 180000834.9276
Epoch 767/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205890845.0701 - val_loss: 179997642.2018
Epoch 768/1000000
3921/3921 [==============================] - 0s 101us/step - loss: 205887623.1594 - val_loss: 179994510.8909
Epoch 769/1000000
3921/3921 [==============================] - 0s 99us/step - loss: 205884425.9322 - val_loss: 179991597.6962
Epoch 770/1000000
3921/3921 [==============================] - 0s 79us/step - loss: 205881206.4983 - val_loss: 179988311.5474
Epoch 771/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 205878265.6404 - val_loss: 179985432.2773
Epoch 772/1000000
3921/3921 [==============================] - 0s 77us/step - loss: 205875052.8865 - val_loss: 179982239.8614
Epoch 773/1000000
3921/3921 [==============================] - 0s 79us/step - loss: 205871464.0066 - val_loss: 179979048.5668
Epoch 774/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205868217.6985 - val_loss: 179975933.1702
Epoch 775/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 205865001.9566 - val_loss: 179972886.0591
Epoch 776/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 205861826.3423 - val_loss: 179969701.3293
Epoch 777/1000000
3921/3921 [==============================] - 0s 76us/step - loss: 205858576.9630 - val_loss: 179966529.7492
Epoch 778/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 205855222.5106 - val_loss: 179963313.5861
Epoch 779/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 205852048.1143 - val_loss: 179960253.0316
Epoch 780/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 205848950.7320 - val_loss: 179957075.2212
Epoch 781/1000000
3921/3921 [==============================] - 0s 95us/step - loss: 205845467.1747 - val_loss: 179953968.1794
Epoch 782/1000000
3921/3921 [==============================] - 0s 106us/step - loss: 205842231.7001 - val_loss: 179950881.8063
Epoch 783/1000000
3921/3921 [==============================] - 0s 111us/step - loss: 205838980.7784 - val_loss: 179947724.3629
Epoch 784/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205835890.4565 - val_loss: 179944658.3038
Epoch 785/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 205832518.7085 - val_loss: 179941552.8236
Epoch 786/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205829304.7692 - val_loss: 179938566.7768
Epoch 787/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 205826074.1321 - val_loss: 179935347.6942
Epoch 788/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 205822868.6580 - val_loss: 179932342.5525
Epoch 789/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 205819640.6998 - val_loss: 179929176.1835
Epoch 790/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 205816401.9220 - val_loss: 179926012.2446
Epoch 791/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 205813176.5407 - val_loss: 179922926.6789
Epoch 792/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 205809944.8426 - val_loss: 179919741.6555
Epoch 793/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 205806830.3943 - val_loss: 179916721.8512
Epoch 794/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 205803528.8059 - val_loss: 179913927.4781
Epoch 795/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 205800555.4843 - val_loss: 179910515.8451
Epoch 796/1000000
3921/3921 [==============================] - 0s 99us/step - loss: 205797218.9870 - val_loss: 179907709.4149
Epoch 797/1000000
3921/3921 [==============================] - 0s 119us/step - loss: 205794081.2650 - val_loss: 179904487.6371
Epoch 798/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 205790775.3287 - val_loss: 179901441.4353
Epoch 799/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 205787697.9760 - val_loss: 179898366.6626
Epoch 800/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 205784474.2627 - val_loss: 179895225.3904
Epoch 801/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 205781178.8896 - val_loss: 179892173.2192
Epoch 802/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 205777924.6070 - val_loss: 179889020.9786
Epoch 803/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 205774626.1199 - val_loss: 179885800.0204
Epoch 804/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 205771376.5754 - val_loss: 179882847.9388
Epoch 805/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 205768143.0411 - val_loss: 179879615.0540
Epoch 806/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205764916.9130 - val_loss: 179876432.4730
Epoch 807/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 205761669.2395 - val_loss: 179873501.0398
Epoch 808/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 205758511.6613 - val_loss: 179870366.0224
Epoch 809/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 205755311.4410 - val_loss: 179867270.4954
Epoch 810/1000000
3921/3921 [==============================] - 0s 99us/step - loss: 205752147.2930 - val_loss: 179864355.9144
Epoch 811/1000000
3921/3921 [==============================] - 0s 116us/step - loss: 205748858.6952 - val_loss: 179860870.4139
Epoch 812/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 205745583.9490 - val_loss: 179857752.3384
Epoch 813/1000000
3921/3921 [==============================] - 0s 79us/step - loss: 205742300.0908 - val_loss: 179854693.1091
Epoch 814/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205739256.4264 - val_loss: 179851824.0000
Epoch 815/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205736158.0974 - val_loss: 179848761.7085
Epoch 816/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 205732851.1553 - val_loss: 179845721.8634
Epoch 817/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 205729578.7136 - val_loss: 179842549.1947
Epoch 818/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 205726337.9281 - val_loss: 179839475.7554
Epoch 819/1000000
3921/3921 [==============================] - 0s 79us/step - loss: 205723110.2555 - val_loss: 179836413.2762
Epoch 820/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 205719885.3833 - val_loss: 179833321.0479
Epoch 821/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 205716790.3616 - val_loss: 179829903.8981
Epoch 822/1000000
3921/3921 [==============================] - 0s 79us/step - loss: 205713415.5919 - val_loss: 179826819.5066
Epoch 823/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 205710164.3866 - val_loss: 179823814.3242
Epoch 824/1000000
3921/3921 [==============================] - 0s 92us/step - loss: 205706988.7345 - val_loss: 179820955.8287
Epoch 825/1000000
3921/3921 [==============================] - 0s 98us/step - loss: 205703861.0599 - val_loss: 179817801.9817
Epoch 826/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205700629.1487 - val_loss: 179814767.3191
Epoch 827/1000000
3921/3921 [==============================] - 0s 74us/step - loss: 205697417.1864 - val_loss: 179811804.7625
Epoch 828/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 205694177.2323 - val_loss: 179808307.4292
Epoch 829/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 205690891.8990 - val_loss: 179805193.9409
Epoch 830/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 205687642.8615 - val_loss: 179802153.9123
Epoch 831/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 205684430.4535 - val_loss: 179799077.1743
Epoch 832/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 205681270.7493 - val_loss: 179795889.2966
Epoch 833/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 205678024.6937 - val_loss: 179792883.4699
Epoch 834/1000000
3921/3921 [==============================] - 0s 79us/step - loss: 205674825.6955 - val_loss: 179789818.2181
Epoch 835/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 205671595.8092 - val_loss: 179786723.0377
Epoch 836/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 205668377.0946 - val_loss: 179783948.1468
Epoch 837/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 205666003.0441 - val_loss: 179781462.7482
Epoch 838/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 205662521.9974 - val_loss: 179777848.0693
Epoch 839/1000000
3921/3921 [==============================] - 0s 106us/step - loss: 205659259.7235 - val_loss: 179774618.9806
Epoch 840/1000000
3921/3921 [==============================] - 0s 98us/step - loss: 205655881.9725 - val_loss: 179771480.9908
Epoch 841/1000000
3921/3921 [==============================] - 0s 78us/step - loss: 205652820.5040 - val_loss: 179768573.6432
Epoch 842/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205649499.8164 - val_loss: 179765478.6463
Epoch 843/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 205646108.8416 - val_loss: 179762274.6340
Epoch 844/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 205642960.3060 - val_loss: 179759193.9246
Epoch 845/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 205639654.8962 - val_loss: 179755910.3731
Epoch 846/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 205636442.0281 - val_loss: 179752834.4546
Epoch 847/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 205633321.1813 - val_loss: 179749745.0357
Epoch 848/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 205629960.1938 - val_loss: 179746501.9735
Epoch 849/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205626774.9554 - val_loss: 179743420.7625
Epoch 850/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205623538.9584 - val_loss: 179740542.3242
Epoch 851/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 205620317.5027 - val_loss: 179737354.9684
Epoch 852/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 205617073.7705 - val_loss: 179734168.5056
Epoch 853/1000000
3921/3921 [==============================] - 0s 110us/step - loss: 205613832.0245 - val_loss: 179731034.9154
Epoch 854/1000000
3921/3921 [==============================] - 0s 106us/step - loss: 205610883.4828 - val_loss: 179728795.4169
Epoch 855/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 205607676.5040 - val_loss: 179725341.0887
Epoch 856/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 205604593.0161 - val_loss: 179722209.2273
Epoch 857/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 205601380.4070 - val_loss: 179720495.2701
Epoch 858/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 205598436.7416 - val_loss: 179716312.6157
Epoch 859/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205595049.1568 - val_loss: 179712918.6667
Epoch 860/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 205591671.2813 - val_loss: 179709689.7003
Epoch 861/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205588551.8067 - val_loss: 179706787.3394
Epoch 862/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205585236.0265 - val_loss: 179703627.9633
Epoch 863/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205582026.6095 - val_loss: 179700417.7737
Epoch 864/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 205578778.3688 - val_loss: 179697369.2192
Epoch 865/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 205575747.0768 - val_loss: 179694180.9990
Epoch 866/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 205572380.1807 - val_loss: 179691058.3527
Epoch 867/1000000
3921/3921 [==============================] - 0s 103us/step - loss: 205569065.7914 - val_loss: 179688082.9480
Epoch 868/1000000
3921/3921 [==============================] - 0s 110us/step - loss: 205566071.0553 - val_loss: 179685028.6972
Epoch 869/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 205562711.9184 - val_loss: 179681863.7757
Epoch 870/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 205559490.9217 - val_loss: 179678832.0938
Epoch 871/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 205556300.6254 - val_loss: 179675604.1305
Epoch 872/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205553018.7197 - val_loss: 179672581.4924
Epoch 873/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205549754.3851 - val_loss: 179669494.9847
Epoch 874/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 205546591.1023 - val_loss: 179666430.4383
Epoch 875/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 205543529.4058 - val_loss: 179663608.1427
Epoch 876/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 205540578.9793 - val_loss: 179660385.3170
Epoch 877/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205537118.2290 - val_loss: 179657190.5240
Epoch 878/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 205533876.9987 - val_loss: 179654108.4893
Epoch 879/1000000
3921/3921 [==============================] - 0s 76us/step - loss: 205530735.5471 - val_loss: 179651103.0336
Epoch 880/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 205527486.5065 - val_loss: 179648060.7870
Epoch 881/1000000
3921/3921 [==============================] - 0s 104us/step - loss: 205524286.1719 - val_loss: 179644883.1233
Epoch 882/1000000
3921/3921 [==============================] - 0s 112us/step - loss: 205521083.6083 - val_loss: 179641840.1713
Epoch 883/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 205517912.7141 - val_loss: 179638755.4292
Epoch 884/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 205514722.0750 - val_loss: 179635638.0183
Epoch 885/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205511480.1826 - val_loss: 179632552.9704
Epoch 886/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 205508354.0546 - val_loss: 179629547.4251
Epoch 887/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 205505147.0951 - val_loss: 179626503.2905
Epoch 888/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 205501957.9107 - val_loss: 179623417.2314
Epoch 889/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 205498772.1194 - val_loss: 179620310.5036
Epoch 890/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 205495796.0581 - val_loss: 179618897.5902
Epoch 891/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 205492965.3915 - val_loss: 179614691.5963
Epoch 892/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205489587.6276 - val_loss: 179611343.4536
Epoch 893/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 205486410.0872 - val_loss: 179608525.2273
Epoch 894/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 205482927.4634 - val_loss: 179604993.9653
Epoch 895/1000000
3921/3921 [==============================] - 0s 93us/step - loss: 205479744.5998 - val_loss: 179602018.7931
Epoch 896/1000000
3921/3921 [==============================] - 0s 106us/step - loss: 205476549.7108 - val_loss: 179598825.5372
Epoch 897/1000000
3921/3921 [==============================] - 0s 90us/step - loss: 205473345.1977 - val_loss: 179595895.0173
Epoch 898/1000000
3921/3921 [==============================] - 0s 69us/step - loss: 205470267.2257 - val_loss: 179592913.3048
Epoch 899/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 205467065.9689 - val_loss: 179589809.8552
Epoch 900/1000000
3921/3921 [==============================] - 0s 76us/step - loss: 205463821.2007 - val_loss: 179586918.9643
Epoch 901/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 205460764.3928 - val_loss: 179583871.4862
Epoch 902/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 205457572.4152 - val_loss: 179580342.8012
Epoch 903/1000000
3921/3921 [==============================] - 0s 79us/step - loss: 205454362.5621 - val_loss: 179577930.5973
Epoch 904/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 205451134.0393 - val_loss: 179574401.9205
Epoch 905/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 205447805.2680 - val_loss: 179571294.2018
Epoch 906/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 205444964.1785 - val_loss: 179568301.9286
Epoch 907/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 205441553.1895 - val_loss: 179565114.4424
Epoch 908/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 205438280.1704 - val_loss: 179562149.7207
Epoch 909/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205435094.8314 - val_loss: 179559034.9317
Epoch 910/1000000
3921/3921 [==============================] - 0s 106us/step - loss: 205431863.7694 - val_loss: 179555851.2579
Epoch 911/1000000
3921/3921 [==============================] - 0s 113us/step - loss: 205428823.3435 - val_loss: 179552921.7452
Epoch 912/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 205425709.3762 - val_loss: 179550228.1305
Epoch 913/1000000
3921/3921 [==============================] - 0s 89us/step - loss: 205422556.6784 - val_loss: 179546883.5066
Epoch 914/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205419325.6822 - val_loss: 179543821.4027
Epoch 915/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 205416176.9508 - val_loss: 179540903.2538
Epoch 916/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205412988.3275 - val_loss: 179537850.9439
Epoch 917/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 205409920.4611 - val_loss: 179534712.5341
Epoch 918/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 205406631.2471 - val_loss: 179531850.1203
Epoch 919/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 205403537.2119 - val_loss: 179528383.4536
Epoch 920/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 205400240.1999 - val_loss: 179525367.9470
Epoch 921/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205397052.4825 - val_loss: 179522389.4964
Epoch 922/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 205394019.5687 - val_loss: 179519495.1723
Epoch 923/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 205390896.3856 - val_loss: 179516341.8634
Epoch 924/1000000
3921/3921 [==============================] - 0s 109us/step - loss: 205387903.9225 - val_loss: 179513711.5719
Epoch 925/1000000
3921/3921 [==============================] - 0s 113us/step - loss: 205384408.7080 - val_loss: 179510238.3649
Epoch 926/1000000
3921/3921 [==============================] - 0s 78us/step - loss: 205381168.6672 - val_loss: 179507012.2202
Epoch 927/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 205377936.9549 - val_loss: 179504072.4567
Epoch 928/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 205374883.8949 - val_loss: 179501196.5505
Epoch 929/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205371732.4764 - val_loss: 179498066.7401
Epoch 930/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205368500.7631 - val_loss: 179494759.8369
Epoch 931/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205365298.9258 - val_loss: 179492208.7747
Epoch 932/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 205362133.1497 - val_loss: 179488680.9867
Epoch 933/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 205358912.5182 - val_loss: 179485660.7584
Epoch 934/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 205355879.1405 - val_loss: 179482612.4159
Epoch 935/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205352722.5259 - val_loss: 179480374.0265
Epoch 936/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205349767.0594 - val_loss: 179476884.8970
Epoch 937/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 205346449.9974 - val_loss: 179473686.6789
Epoch 938/1000000
3921/3921 [==============================] - 0s 102us/step - loss: 205343302.0566 - val_loss: 179471549.9613
Epoch 939/1000000
3921/3921 [==============================] - 0s 117us/step - loss: 205340533.5455 - val_loss: 179468002.1325
Epoch 940/1000000
3921/3921 [==============================] - 0s 78us/step - loss: 205337554.7248 - val_loss: 179464754.5321
Epoch 941/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 205333793.5404 - val_loss: 179461387.7023
Epoch 942/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 205330714.5728 - val_loss: 179458465.9286
Epoch 943/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 205327399.8959 - val_loss: 179455448.9786
Epoch 944/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 205324493.5557 - val_loss: 179452309.1213
Epoch 945/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 205321377.7363 - val_loss: 179449600.7625
Epoch 946/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 205318603.6909 - val_loss: 179446895.0051
Epoch 947/1000000
3921/3921 [==============================] - 0s 74us/step - loss: 205315055.5919 - val_loss: 179443401.0561
Epoch 948/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 205311594.5759 - val_loss: 179440070.4709
Epoch 949/1000000
3921/3921 [==============================] - 0s 89us/step - loss: 205308404.0898 - val_loss: 179436954.6218
Epoch 950/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 205305228.3724 - val_loss: 179433990.4832
Epoch 951/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 205302147.0686 - val_loss: 179431691.3680
Epoch 952/1000000
3921/3921 [==============================] - 0s 93us/step - loss: 205299035.8949 - val_loss: 179427897.9327
Epoch 953/1000000
3921/3921 [==============================] - 0s 106us/step - loss: 205295653.6394 - val_loss: 179424818.8542
Epoch 954/1000000
3921/3921 [==============================] - 0s 79us/step - loss: 205292623.0411 - val_loss: 179421832.3629
Epoch 955/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 205289408.6815 - val_loss: 179418773.9205
Epoch 956/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 205286286.8534 - val_loss: 179415579.8084
Epoch 957/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 205283044.7743 - val_loss: 179412592.8848
Epoch 958/1000000
3921/3921 [==============================] - 0s 78us/step - loss: 205279902.8289 - val_loss: 179409697.4149
Epoch 959/1000000
3921/3921 [==============================] - 0s 77us/step - loss: 205276674.0750 - val_loss: 179406409.8634
Epoch 960/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 205273703.5940 - val_loss: 179403800.4363
Epoch 961/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 205270464.3244 - val_loss: 179400432.8318
Epoch 962/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 205267134.0168 - val_loss: 179397504.4975
Epoch 963/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 205264023.7001 - val_loss: 179394277.3619
Epoch 964/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 205261182.4494 - val_loss: 179391572.7217
Epoch 965/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 205258587.4889 - val_loss: 179388266.4546
Epoch 966/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 205254615.6960 - val_loss: 179385284.7380
Epoch 967/1000000
3921/3921 [==============================] - 0s 104us/step - loss: 205251450.8462 - val_loss: 179382234.3935
Epoch 968/1000000
3921/3921 [==============================] - 0s 100us/step - loss: 205248213.2905 - val_loss: 179379234.2915
Epoch 969/1000000
3921/3921 [==============================] - 0s 70us/step - loss: 205245305.1773 - val_loss: 179376007.0377
Epoch 970/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 205242043.5945 - val_loss: 179373063.4332
Epoch 971/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 205238769.5506 - val_loss: 179369956.2120
Epoch 972/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 205235608.0184 - val_loss: 179366997.4883
Epoch 973/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 205232460.2295 - val_loss: 179363881.7900
Epoch 974/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205229197.4251 - val_loss: 179360798.1244
Epoch 975/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 205226086.2091 - val_loss: 179357836.7910
Epoch 976/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 205222850.5504 - val_loss: 179354746.8746
Epoch 977/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 205219674.2627 - val_loss: 179351747.0989
Epoch 978/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 205216583.2635 - val_loss: 179348939.0418
Epoch 979/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 205213508.7539 - val_loss: 179345747.4699
Epoch 980/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 205210613.5027 - val_loss: 179342652.3833
Epoch 981/1000000
3921/3921 [==============================] - ETA: 0s - loss: 207325394.413 - 0s 111us/step - loss: 205207157.0997 - val_loss: 179339675.2946
Epoch 982/1000000
3921/3921 [==============================] - 0s 115us/step - loss: 205204019.6123 - val_loss: 179336524.9990
Epoch 983/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 205200871.7939 - val_loss: 179333438.5158
Epoch 984/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 205197689.1217 - val_loss: 179330582.2181
Epoch 985/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 205194720.3917 - val_loss: 179327836.9093
Epoch 986/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 205191479.9204 - val_loss: 179324641.8675
Epoch 987/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205188276.6274 - val_loss: 179321368.5382
Epoch 988/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 205185085.6639 - val_loss: 179318571.5882
Epoch 989/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 205182026.9115 - val_loss: 179315566.2304
Epoch 990/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 205178913.6384 - val_loss: 179312672.0000
Epoch 991/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 205175945.8077 - val_loss: 179309824.7706
Epoch 992/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 205173055.9592 - val_loss: 179307064.9011
Epoch 993/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 205169779.0849 - val_loss: 179303431.8287
Epoch 994/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 205166591.4940 - val_loss: 179300707.6493
Epoch 995/1000000
3921/3921 [==============================] - 0s 108us/step - loss: 205163661.4262 - val_loss: 179298303.7798
Epoch 996/1000000
3921/3921 [==============================] - 0s 116us/step - loss: 205160521.4160 - val_loss: 179294742.7319
Epoch 997/1000000
3921/3921 [==============================] - 0s 79us/step - loss: 205157272.4183 - val_loss: 179291712.9501
Epoch 998/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 205154116.7008 - val_loss: 179288709.9980
Epoch 999/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 205150988.4774 - val_loss: 179285584.4934
Epoch 1000/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 205147967.3716 - val_loss: 179283740.3303
Epoch 1001/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 205145479.6899 - val_loss: 179280178.9276
Epoch 1002/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205141409.7077 - val_loss: 179276102.7523
Epoch 1003/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 205138041.3752 - val_loss: 179273099.3313
Epoch 1004/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 205134887.6001 - val_loss: 179270065.5902
Epoch 1005/1000000
3921/3921 [==============================] - 0s 75us/step - loss: 205131838.3443 - val_loss: 179267111.6656
Epoch 1006/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 205128996.0398 - val_loss: 179264947.2905
Epoch 1007/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 205125614.9645 - val_loss: 179261214.7523
Epoch 1008/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 205122289.6131 - val_loss: 179258103.2824
Epoch 1009/1000000
3921/3921 [==============================] - 0s 103us/step - loss: 205119171.8623 - val_loss: 179254986.1448
Epoch 1010/1000000
3921/3921 [==============================] - 0s 109us/step - loss: 205115995.1767 - val_loss: 179251903.9062
Epoch 1011/1000000
3921/3921 [==============================] - 0s 77us/step - loss: 205112852.7947 - val_loss: 179248827.5923
Epoch 1012/1000000
3921/3921 [==============================] - 0s 77us/step - loss: 205109972.4642 - val_loss: 179246760.4200
Epoch 1013/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 205107169.0242 - val_loss: 179243695.4944
Epoch 1014/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 205104011.3604 - val_loss: 179240415.5433
Epoch 1015/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 205100754.3688 - val_loss: 179237333.0479
Epoch 1016/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205097392.8896 - val_loss: 179233706.6300
Epoch 1017/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 205093898.7564 - val_loss: 179230892.2324
Epoch 1018/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 205090889.4180 - val_loss: 179227847.3884
Epoch 1019/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205088195.2645 - val_loss: 179224481.1743
Epoch 1020/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205085089.9546 - val_loss: 179223095.9592
Epoch 1021/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 205081582.2096 - val_loss: 179218447.7717
Epoch 1022/1000000
3921/3921 [==============================] - 0s 76us/step - loss: 205078167.4675 - val_loss: 179215564.6075
Epoch 1023/1000000
3921/3921 [==============================] - 0s 93us/step - loss: 205075237.7700 - val_loss: 179212453.1539
Epoch 1024/1000000
3921/3921 [==============================] - 0s 107us/step - loss: 205071958.6473 - val_loss: 179209609.6147
Epoch 1025/1000000
3921/3921 [==============================] - 0s 92us/step - loss: 205068972.0459 - val_loss: 179206512.8522
Epoch 1026/1000000
3921/3921 [==============================] - 0s 74us/step - loss: 205065685.3048 - val_loss: 179203319.8858
Epoch 1027/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 205062562.9054 - val_loss: 179200256.0000
Epoch 1028/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205059487.2308 - val_loss: 179197370.2345
Epoch 1029/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 205057116.0561 - val_loss: 179195015.7146
Epoch 1030/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 205053269.4598 - val_loss: 179191435.8777
Epoch 1031/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 205049988.3254 - val_loss: 179188349.3619
Epoch 1032/1000000
3921/3921 [==============================] - 0s 72us/step - loss: 205046867.8847 - val_loss: 179185369.4149
Epoch 1033/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 205043637.3466 - val_loss: 179182131.2783
Epoch 1034/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 205040471.5817 - val_loss: 179179305.0805
Epoch 1035/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 205037434.6034 - val_loss: 179176331.6249
Epoch 1036/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205034526.8330 - val_loss: 179173769.2640
Epoch 1037/1000000
3921/3921 [==============================] - 0s 75us/step - loss: 205031408.9079 - val_loss: 179170690.7727
Epoch 1038/1000000
3921/3921 [==============================] - 0s 106us/step - loss: 205028367.4573 - val_loss: 179167654.0714
Epoch 1039/1000000
3921/3921 [==============================] - 0s 115us/step - loss: 205025149.9638 - val_loss: 179164424.2406
Epoch 1040/1000000
3921/3921 [==============================] - 0s 78us/step - loss: 205021924.8926 - val_loss: 179161200.3058
Epoch 1041/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205018607.7144 - val_loss: 179158151.5882
Epoch 1042/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205015335.2798 - val_loss: 179155088.0367
Epoch 1043/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 205012814.9268 - val_loss: 179153772.7095
Epoch 1044/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 205009713.8011 - val_loss: 179150029.4964
Epoch 1045/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 205006528.9375 - val_loss: 179146222.4791
Epoch 1046/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 205002971.0298 - val_loss: 179143158.4709
Epoch 1047/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 204999694.6590 - val_loss: 179140256.5912
Epoch 1048/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 204996567.9653 - val_loss: 179137147.9633
Epoch 1049/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 204993437.5598 - val_loss: 179134093.8634
Epoch 1050/1000000
3921/3921 [==============================] - 0s 90us/step - loss: 204990383.0084 - val_loss: 179131120.0856
Epoch 1051/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 204987412.0602 - val_loss: 179128410.4587
Epoch 1052/1000000
3921/3921 [==============================] - 0s 99us/step - loss: 204984289.6730 - val_loss: 179125035.7187
Epoch 1053/1000000
3921/3921 [==============================] - 0s 111us/step - loss: 204981058.1423 - val_loss: 179122205.9939
Epoch 1054/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 204978107.6603 - val_loss: 179119331.4006
Epoch 1055/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 204974848.8855 - val_loss: 179116062.5240
Epoch 1056/1000000
3921/3921 [==============================] - 0s 89us/step - loss: 204971743.1920 - val_loss: 179113275.9185
Epoch 1057/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 204968501.6883 - val_loss: 179110105.7819
Epoch 1058/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 204965402.7768 - val_loss: 179107089.8593
Epoch 1059/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 204962278.0311 - val_loss: 179103853.4801
Epoch 1060/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 204959095.5042 - val_loss: 179100892.5219
Epoch 1061/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 204955876.7906 - val_loss: 179097927.3884
Epoch 1062/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 204953142.8391 - val_loss: 179095489.6677
Epoch 1063/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 204950051.3216 - val_loss: 179092073.5535
Epoch 1064/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 204946559.5552 - val_loss: 179088922.2263
Epoch 1065/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 204943255.1268 - val_loss: 179085858.9684
Epoch 1066/1000000
3921/3921 [==============================] - 0s 93us/step - loss: 204940123.7072 - val_loss: 179082864.6402
Epoch 1067/1000000
3921/3921 [==============================] - 0s 116us/step - loss: 204937273.6506 - val_loss: 179079943.4495
Epoch 1068/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 204934151.5573 - val_loss: 179076943.4985
Epoch 1069/1000000
3921/3921 [==============================] - 0s 73us/step - loss: 204930894.4249 - val_loss: 179073726.7278
Epoch 1070/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 204927613.7475 - val_loss: 179070773.0846
Epoch 1071/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 204924639.2369 - val_loss: 179067714.8420
Epoch 1072/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 204921419.5399 - val_loss: 179064893.0520
Epoch 1073/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 204918325.8822 - val_loss: 179061674.1448
Epoch 1074/1000000
3921/3921 [==============================] - 0s 78us/step - loss: 204915196.4907 - val_loss: 179058629.0642
Epoch 1075/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 204912090.0515 - val_loss: 179056550.1896
Epoch 1076/1000000
3921/3921 [==============================] - 0s 89us/step - loss: 204909468.6427 - val_loss: 179053437.2844
Epoch 1077/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 204906270.6044 - val_loss: 179050118.9317
Epoch 1078/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 204903039.3675 - val_loss: 179047355.7594
Epoch 1079/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 204900632.8467 - val_loss: 179045241.3782
Epoch 1080/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 204897451.7399 - val_loss: 179042070.9317
Epoch 1081/1000000
3921/3921 [==============================] - 0s 104us/step - loss: 204894383.2573 - val_loss: 179038280.0612
Epoch 1082/1000000
3921/3921 [==============================] - 0s 100us/step - loss: 204890560.6192 - val_loss: 179035019.4822
Epoch 1083/1000000
3921/3921 [==============================] - 0s 72us/step - loss: 204887467.8052 - val_loss: 179032016.6606
Epoch 1084/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 204884158.7391 - val_loss: 179028821.7248
Epoch 1085/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 204881107.3583 - val_loss: 179026035.8410
Epoch 1086/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 204878114.7340 - val_loss: 179023117.3048
Epoch 1087/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 204874950.2188 - val_loss: 179019900.3751
Epoch 1088/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 204871722.7646 - val_loss: 179016727.5189
Epoch 1089/1000000
3921/3921 [==============================] - 0s 76us/step - loss: 204868433.1875 - val_loss: 179013947.0744
Epoch 1090/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 204865543.1688 - val_loss: 179011036.4975
Epoch 1091/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 204862519.7154 - val_loss: 179008003.5392
Epoch 1092/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 204859207.2145 - val_loss: 179004962.7482
Epoch 1093/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 204856483.3298 - val_loss: 179001920.9908
Epoch 1094/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 204853091.9867 - val_loss: 178999241.8634
Epoch 1095/1000000
3921/3921 [==============================] - 0s 97us/step - loss: 204849933.8250 - val_loss: 178996151.8287
Epoch 1096/1000000
3921/3921 [==============================] - 0s 106us/step - loss: 204846728.4223 - val_loss: 178992646.4873
Epoch 1097/1000000
3921/3921 [==============================] - 0s 78us/step - loss: 204843409.7179 - val_loss: 178989797.2355
Epoch 1098/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 204840448.0032 - val_loss: 178986610.3894
Epoch 1099/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 204837270.3351 - val_loss: 178983907.0418
Epoch 1100/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 204834135.7480 - val_loss: 178980685.3863
Epoch 1101/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 204831171.2482 - val_loss: 178977627.1641
Epoch 1102/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 204828048.8447 - val_loss: 178975286.2956
Epoch 1103/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 204825287.5409 - val_loss: 178972329.3945
Epoch 1104/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 204821827.7679 - val_loss: 178968899.7146
Epoch 1105/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 204818732.5193 - val_loss: 178965798.4832
Epoch 1106/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 204815551.3134 - val_loss: 178962902.4995
Epoch 1107/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 204812477.7557 - val_loss: 178960055.0663
Epoch 1108/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 204809308.2336 - val_loss: 178956505.6595
Epoch 1109/1000000
3921/3921 [==============================] - 0s 106us/step - loss: 204806104.9651 - val_loss: 178953904.4118
Epoch 1110/1000000
3921/3921 [==============================] - 0s 110us/step - loss: 204803070.3576 - val_loss: 178950809.7085
Epoch 1111/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 204800212.7784 - val_loss: 178948042.0999
Epoch 1112/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 204797005.6771 - val_loss: 178945053.3211
Epoch 1113/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 204794070.6963 - val_loss: 178942040.9990
Epoch 1114/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 204790644.1173 - val_loss: 178938818.5362
Epoch 1115/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 204787659.6746 - val_loss: 178935816.7176
Epoch 1116/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 204784511.1696 - val_loss: 178933032.0897
Epoch 1117/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 204781367.3757 - val_loss: 178929857.3456
Epoch 1118/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 204778190.9676 - val_loss: 178926688.4281
Epoch 1119/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 204774951.6840 - val_loss: 178924007.2457
Epoch 1120/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 204771962.7360 - val_loss: 178920957.0928
Epoch 1121/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 204769248.2836 - val_loss: 178917921.3782
Epoch 1122/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 204765706.9156 - val_loss: 178914776.5015
Epoch 1123/1000000
3921/3921 [==============================] - 0s 106us/step - loss: 204762541.9842 - val_loss: 178911729.8797
Epoch 1124/1000000
3921/3921 [==============================] - 0s 115us/step - loss: 204759718.3831 - val_loss: 178909081.4679
Epoch 1125/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 204756436.9314 - val_loss: 178905777.0928
Epoch 1126/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 204753197.5435 - val_loss: 178902872.5708
Epoch 1127/1000000
3921/3921 [==============================] - 0s 89us/step - loss: 204750352.5672 - val_loss: 178900200.5260
Epoch 1128/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 204747063.3491 - val_loss: 178896925.2436
Epoch 1129/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 204743912.1153 - val_loss: 178894146.0061
Epoch 1130/1000000
3921/3921 [==============================] - 0s 79us/step - loss: 204740760.5590 - val_loss: 178890805.3619
Epoch 1131/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 204737816.4672 - val_loss: 178888255.4169
Epoch 1132/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 204734791.6307 - val_loss: 178885877.9857
Epoch 1133/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 204731944.6835 - val_loss: 178882676.8196
Epoch 1134/1000000
3921/3921 [==============================] - 0s 77us/step - loss: 204728571.6093 - val_loss: 178878929.4597
Epoch 1135/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 204725686.7554 - val_loss: 178876868.4893
Epoch 1136/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 204722667.7113 - val_loss: 178873994.4709
Epoch 1137/1000000
3921/3921 [==============================] - 0s 100us/step - loss: 204719537.5486 - val_loss: 178870088.4567
Epoch 1138/1000000
3921/3921 [==============================] - 0s 110us/step - loss: 204716071.4675 - val_loss: 178867565.8716
Epoch 1139/1000000
3921/3921 [==============================] - 0s 79us/step - loss: 204713915.6827 - val_loss: 178864165.0968
Epoch 1140/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 204710001.5771 - val_loss: 178861351.2416
Epoch 1141/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 204706724.7335 - val_loss: 178858098.9439
Epoch 1142/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 204703807.6901 - val_loss: 178854991.9837
Epoch 1143/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 204700754.2188 - val_loss: 178852250.2141
Epoch 1144/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 204697496.8528 - val_loss: 178849121.1743
Epoch 1145/1000000
3921/3921 [==============================] - 0s 79us/step - loss: 204694553.3632 - val_loss: 178846148.1019
Epoch 1146/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 204691412.1173 - val_loss: 178843072.4444
Epoch 1147/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 204688340.3703 - val_loss: 178840501.5984
Epoch 1148/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 204685187.8562 - val_loss: 178837565.3089
Epoch 1149/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 204682309.2599 - val_loss: 178834841.4475
Epoch 1150/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 204679213.5088 - val_loss: 178831478.9929
Epoch 1151/1000000
3921/3921 [==============================] - 0s 95us/step - loss: 204675957.7863 - val_loss: 178828397.0805
Epoch 1152/1000000
3921/3921 [==============================] - 0s 104us/step - loss: 204672728.4346 - val_loss: 178825492.6320
Epoch 1153/1000000
3921/3921 [==============================] - 0s 91us/step - loss: 204669613.5909 - val_loss: 178822562.2222
Epoch 1154/1000000
3921/3921 [==============================] - 0s 74us/step - loss: 204666475.1247 - val_loss: 178819576.0652
Epoch 1155/1000000
3921/3921 [==============================] - 0s 71us/step - loss: 204663950.6616 - val_loss: 178817163.2212
Epoch 1156/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 204660709.6297 - val_loss: 178814148.9052
Epoch 1157/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 204657582.9431 - val_loss: 178811086.5117
Epoch 1158/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 204654403.9990 - val_loss: 178807873.7982
Epoch 1159/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 204651133.1477 - val_loss: 178804792.2039
Epoch 1160/1000000
3921/3921 [==============================] - 0s 76us/step - loss: 204647993.7475 - val_loss: 178801769.0724
Epoch 1161/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 204645168.6121 - val_loss: 178798681.4720
Epoch 1162/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 204641985.4547 - val_loss: 178795963.3843
Epoch 1163/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 204638781.1395 - val_loss: 178792968.7788
Epoch 1164/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 204635729.1701 - val_loss: 178789981.2559
Epoch 1165/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 204632634.1729 - val_loss: 178786736.8359
Epoch 1166/1000000
3921/3921 [==============================] - 0s 107us/step - loss: 204629568.8998 - val_loss: 178783510.1692
Epoch 1167/1000000
3921/3921 [==============================] - 0s 117us/step - loss: 204626201.8587 - val_loss: 178780600.2650
Epoch 1168/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 204623194.7840 - val_loss: 178777795.5719
Epoch 1169/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 204620484.3091 - val_loss: 178775184.0775
Epoch 1170/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 204617238.5677 - val_loss: 178771830.0510
Epoch 1171/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 204614132.3866 - val_loss: 178769268.8196
Epoch 1172/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 204611046.0311 - val_loss: 178765840.8073
Epoch 1173/1000000
3921/3921 [==============================] - 0s 89us/step - loss: 204607771.9704 - val_loss: 178762631.9592
Epoch 1174/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 204604389.6129 - val_loss: 178759663.5596
Epoch 1175/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 204601562.1535 - val_loss: 178757071.4332
Epoch 1176/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 204598535.8633 - val_loss: 178753868.1835
Epoch 1177/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 204595501.0926 - val_loss: 178751273.0765
Epoch 1178/1000000
3921/3921 [==============================] - 0s 90us/step - loss: 204592823.1778 - val_loss: 178748316.1713
Epoch 1179/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 204589599.0666 - val_loss: 178745221.9980
Epoch 1180/1000000
3921/3921 [==============================] - 0s 113us/step - loss: 204586533.4639 - val_loss: 178742598.3323
Epoch 1181/1000000
3921/3921 [==============================] - 0s 115us/step - loss: 204584044.4784 - val_loss: 178740961.1009
Epoch 1182/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 204580515.5664 - val_loss: 178736139.5107
Epoch 1183/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 204576888.4040 - val_loss: 178733047.6738
Epoch 1184/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 204573852.3091 - val_loss: 178730154.3772
Epoch 1185/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 204570819.2971 - val_loss: 178727347.6901
Epoch 1186/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 204567765.1375 - val_loss: 178724482.8461
Epoch 1187/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 204564605.4945 - val_loss: 178721348.5178
Epoch 1188/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 204561517.9801 - val_loss: 178718358.8583
Epoch 1189/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 204558493.0252 - val_loss: 178715310.2018
Epoch 1190/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 204555099.0829 - val_loss: 178712109.1580
Epoch 1191/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 204551921.2854 - val_loss: 178709763.1519
Epoch 1192/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 204549059.3037 - val_loss: 178706135.5189
Epoch 1193/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 204546012.5356 - val_loss: 178703283.2905
Epoch 1194/1000000
3921/3921 [==============================] - 0s 104us/step - loss: 204542725.3129 - val_loss: 178700283.9511
Epoch 1195/1000000
3921/3921 [==============================] - 0s 105us/step - loss: 204539977.6955 - val_loss: 178697995.8899
Epoch 1196/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 204537209.1313 - val_loss: 178694679.1274
Epoch 1197/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 204533631.9265 - val_loss: 178691746.3160
Epoch 1198/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 204530405.9169 - val_loss: 178688422.7564
Epoch 1199/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 204527289.7036 - val_loss: 178685431.7390
Epoch 1200/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 204524161.2680 - val_loss: 178682678.5688
Epoch 1201/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 204521394.2239 - val_loss: 178679502.6748
Epoch 1202/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 204518217.5159 - val_loss: 178676677.1580
Epoch 1203/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 204515009.8771 - val_loss: 178673588.9541
Epoch 1204/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 204511824.0939 - val_loss: 178670441.9205
Epoch 1205/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 204508903.5164 - val_loss: 178667500.8114
Epoch 1206/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 204505601.1507 - val_loss: 178664531.4047
Epoch 1207/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 204502483.2216 - val_loss: 178661560.0979
Epoch 1208/1000000
3921/3921 [==============================] - 0s 93us/step - loss: 204499556.4601 - val_loss: 178658994.7319
Epoch 1209/1000000
3921/3921 [==============================] - 0s 114us/step - loss: 204496710.9044 - val_loss: 178655705.6799
Epoch 1210/1000000
3921/3921 [==============================] - 0s 90us/step - loss: 204493606.3545 - val_loss: 178653029.1539
Epoch 1211/1000000
3921/3921 [==============================] - 0s 75us/step - loss: 204490407.1206 - val_loss: 178650228.7706
Epoch 1212/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 204487383.6756 - val_loss: 178647002.9480
Epoch 1213/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 204484304.8681 - val_loss: 178644344.9541
Epoch 1214/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 204481303.3185 - val_loss: 178641375.6371
Epoch 1215/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 204478084.8722 - val_loss: 178637940.5138
Epoch 1216/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 204474955.1441 - val_loss: 178634826.1529
Epoch 1217/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 204471967.4767 - val_loss: 178632136.6606
Epoch 1218/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 204469168.1428 - val_loss: 178629745.3863
Epoch 1219/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 204466648.9385 - val_loss: 178626738.2141
Epoch 1220/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 204462706.0648 - val_loss: 178623367.0785
Epoch 1221/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 204459418.6172 - val_loss: 178620094.2508
Epoch 1222/1000000
3921/3921 [==============================] - 0s 91us/step - loss: 204456310.5902 - val_loss: 178617146.4913
Epoch 1223/1000000
3921/3921 [==============================] - 0s 107us/step - loss: 204453154.7299 - val_loss: 178614352.5382
Epoch 1224/1000000
3921/3921 [==============================] - 0s 97us/step - loss: 204450258.6565 - val_loss: 178611614.6626
Epoch 1225/1000000
3921/3921 [==============================] - 0s 73us/step - loss: 204447396.0031 - val_loss: 178608392.9908
Epoch 1226/1000000
3921/3921 [==============================] - 0s 77us/step - loss: 204444394.5198 - val_loss: 178606223.5596
Epoch 1227/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 204442242.0791 - val_loss: 178604377.7411
Epoch 1228/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 204439138.9584 - val_loss: 178600547.6901
Epoch 1229/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 204436001.3303 - val_loss: 178596940.9460
Epoch 1230/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 204432083.8398 - val_loss: 178594362.0795
Epoch 1231/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 204429451.1808 - val_loss: 178591299.0377
Epoch 1232/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 204426266.7401 - val_loss: 178588553.8022
Epoch 1233/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 204423233.6078 - val_loss: 178584999.6371
Epoch 1234/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 204419720.8549 - val_loss: 178582210.3894
Epoch 1235/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 204416683.7745 - val_loss: 178579322.6300
Epoch 1236/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 204413794.7993 - val_loss: 178576405.1213
Epoch 1237/1000000
3921/3921 [==============================] - 0s 113us/step - loss: 204410572.5152 - val_loss: 178573363.0499
Epoch 1238/1000000
3921/3921 [==============================] - 0s 114us/step - loss: 204407654.7218 - val_loss: 178570026.5484
Epoch 1239/1000000
3921/3921 [==============================] - 0s 75us/step - loss: 204404680.6738 - val_loss: 178567594.6911
Epoch 1240/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 204401433.2609 - val_loss: 178564756.6239
Epoch 1241/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 204398568.5907 - val_loss: 178561680.8196
Epoch 1242/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 204395206.7309 - val_loss: 178558104.6320
Epoch 1243/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 204392001.1568 - val_loss: 178555027.5678
Epoch 1244/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 204388820.5009 - val_loss: 178552197.3089
Epoch 1245/1000000
3921/3921 [==============================] - 0s 90us/step - loss: 204385829.4415 - val_loss: 178549561.6473
Epoch 1246/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 204382780.1969 - val_loss: 178546636.1590
Epoch 1247/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 204379817.7343 - val_loss: 178543446.7523
Epoch 1248/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 204376476.7763 - val_loss: 178540216.5872
Epoch 1249/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 204373327.9765 - val_loss: 178537220.4444
Epoch 1250/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 204370255.2594 - val_loss: 178534355.9878
Epoch 1251/1000000
3921/3921 [==============================] - 0s 100us/step - loss: 204367205.4353 - val_loss: 178531529.9735
Epoch 1252/1000000
3921/3921 [==============================] - 0s 108us/step - loss: 204364131.9133 - val_loss: 178528348.1142
Epoch 1253/1000000
3921/3921 [==============================] - 0s 77us/step - loss: 204361260.5927 - val_loss: 178525891.9511
Epoch 1254/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 204358113.6914 - val_loss: 178522862.6340
Epoch 1255/1000000
3921/3921 [==============================] - 0s 88us/step - loss: 204355327.9347 - val_loss: 178520467.2742
Epoch 1256/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 204352291.9888 - val_loss: 178516730.9235
Epoch 1257/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 204348929.0834 - val_loss: 178513829.1988
Epoch 1258/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 204345884.3162 - val_loss: 178510983.0133
Epoch 1259/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 204342837.3333 - val_loss: 178507876.0856
Epoch 1260/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 204339749.6547 - val_loss: 178504890.3364
Epoch 1261/1000000
3921/3921 [==============================] - 0s 80us/step - loss: 204336546.0485 - val_loss: 178502065.5984
Epoch 1262/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 204333632.8610 - val_loss: 178498883.4944
Epoch 1263/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 204330550.7697 - val_loss: 178496762.9521
Epoch 1264/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 204327594.9931 - val_loss: 178493132.5015
Epoch 1265/1000000
3921/3921 [==============================] - 0s 97us/step - loss: 204324813.3680 - val_loss: 178490676.1672
Epoch 1266/1000000
3921/3921 [==============================] - 0s 111us/step - loss: 204321810.5891 - val_loss: 178488151.5148
Epoch 1267/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 204318784.8039 - val_loss: 178485046.5607
Epoch 1268/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 204315784.8998 - val_loss: 178482636.3710
Epoch 1269/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 204313400.0428 - val_loss: 178479698.6911
Epoch 1270/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 204309902.2045 - val_loss: 178476175.1152
Epoch 1271/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 204306442.1015 - val_loss: 178473067.8940
Epoch 1272/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 204303360.5264 - val_loss: 178469886.8542
Epoch 1273/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 204300473.7098 - val_loss: 178468022.9276
Epoch 1274/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 204297530.7422 - val_loss: 178464302.1896
Epoch 1275/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 204294239.3114 - val_loss: 178461766.8542
Epoch 1276/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 204291049.4547 - val_loss: 178458101.6595
Epoch 1277/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 204288253.8781 - val_loss: 178456072.6442
Epoch 1278/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 204285110.3586 - val_loss: 178452528.5749
Epoch 1279/1000000
3921/3921 [==============================] - 0s 95us/step - loss: 204282043.1931 - val_loss: 178449655.3721
Epoch 1280/1000000
3921/3921 [==============================] - 0s 104us/step - loss: 204278958.1296 - val_loss: 178446618.9684
Epoch 1281/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 204276005.4364 - val_loss: 178443813.8471
Epoch 1282/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 204272904.3244 - val_loss: 178440875.4536
Epoch 1283/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 204269981.4690 - val_loss: 178438409.1254
Epoch 1284/1000000
3921/3921 [==============================] - 0s 82us/step - loss: 204266826.7075 - val_loss: 178434943.3598
Epoch 1285/1000000
3921/3921 [==============================] - 0s 89us/step - loss: 204263528.8773 - val_loss: 178431847.8532
Epoch 1286/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 204260385.1262 - val_loss: 178428981.7982
Epoch 1287/1000000
3921/3921 [==============================] - 0s 86us/step - loss: 204257461.2252 - val_loss: 178426075.0581
Epoch 1288/1000000
3921/3921 [==============================] - 0s 81us/step - loss: 204254380.7878 - val_loss: 178422710.1774
Epoch 1289/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 204251103.5593 - val_loss: 178419551.6126
Epoch 1290/1000000
3921/3921 [==============================] - 0s 75us/step - loss: 204247914.2545 - val_loss: 178416559.4781
Epoch 1291/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 204245015.0247 - val_loss: 178414619.5433
Epoch 1292/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 204242245.1752 - val_loss: 178411119.5270
Epoch 1293/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 204238967.2431 - val_loss: 178408195.2497
Epoch 1294/1000000
3921/3921 [==============================] - 0s 119us/step - loss: 204236157.8378 - val_loss: 178406688.9786
Epoch 1295/1000000
3921/3921 [==============================] - 0s 113us/step - loss: 204233252.3152 - val_loss: 178402748.4159
Epoch 1296/1000000
3921/3921 [==============================] - 0s 84us/step - loss: 204229954.4647 - val_loss: 178399731.4618
Epoch 1297/1000000
3921/3921 [==============================] - 0s 87us/step - loss: 204227357.5435 - val_loss: 178397039.0133
Epoch 1298/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 204224058.6503 - val_loss: 178393866.9195
Epoch 1299/1000000
3921/3921 [==============================] - 0s 85us/step - loss: 204221171.6440 - val_loss: 178392024.6972
Epoch 1300/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 204218117.4823 - val_loss: 178387467.8328
Epoch 1301/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 204214663.2349 - val_loss: 178384592.1223
Epoch 1302/1000000
3921/3921 [==============================] - 0s 83us/step - loss: 204211481.9852 - val_loss: 178381169.7900
Epoch 1303/1000000
3921/3921 [==============================] - 0s 90us/step - loss: 204209825.3711 - val_loss: 178383136.1305
Wall time: 9min 9s

Load the model saved by checkpointer.

In [20]:
autoencoder = load_model('model.h5')

Evaluation

Visualize the learning process.

In [21]:
plt.plot(history['loss'])
plt.plot(history['val_loss'])
plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper right');

The reconstruction errors on both train and test data converge nicely.

Calculate predictions by the autoencoder:

In [22]:
testPredictions = autoencoder.predict(X_test)
X_test.shape,testPredictions.shape
Out[22]:
((1082, 64), (1082, 64))

Calculate mean squared error.

In [23]:
testMSE = mean_squared_error(X_test.transpose(), testPredictions.transpose(),
                              multioutput='raw_values')
error_df = pd.DataFrame({'reconstruction_error': testMSE,'true_class': y_test})
error_df.head()
Out[23]:
reconstruction_error true_class
1914 5.353464e+06 0
793 1.827834e+06 0
1034 1.427471e+09 1
1422 5.189102e+04 0
4286 1.365635e+08 1
In [24]:
error_df.shape
Out[24]:
(1082, 2)
In [25]:
error_df.reconstruction_error.describe()
Out[25]:
count    1.082000e+03
mean     1.519234e+09
std      9.226787e+09
min      1.019016e+03
25%      3.961956e+05
50%      5.039243e+06
75%      1.108519e+08
max      1.532731e+11
Name: reconstruction_error, dtype: float64
In [26]:
error_df.reconstruction_error.quantile(0.9)
Out[26]:
1091683005.991309

Reconstruction errors for normal transactions

Plot histogram of errors of reconstruction for normal data.

In [55]:
len(normal_error_df.reconstruction_error.values)
Out[55]:
942
In [58]:
fig = plt.figure()
ax = fig.add_subplot(111)
normal_error_df = error_df[(error_df['true_class']== 0) & (error_df['reconstruction_error'] < 1089669752.125486)]
sns.distplot(normal_error_df.reconstruction_error.values)
plt.title('Normal Transactions', fontsize=15)
plt.xlabel('Reconstruction Errors', fontsize=15)
Out[58]:
Text(0.5, 0, 'Reconstruction Errors')

Reconstruction errors for fraudulent transactions

Compare distribution of reconstruction error for normal data and for fraudulent data.

In [61]:
fig = plt.figure()
ax = fig.add_subplot(111)
fraud_error_df = error_df[error_df['true_class'] == 1]
sns.distplot(fraud_error_df.reconstruction_error.values)
plt.title('Fraudulent Transactions', fontsize=15)
plt.xlabel('Reconstruction Errors', fontsize=15)
Out[61]:
Text(0.5, 0, 'Reconstruction Errors')

Errors of reconstruction of fraudulent data are much larger.

In [29]:
from sklearn.metrics import (confusion_matrix, auc, roc_curve, cohen_kappa_score, accuracy_score)

Calculate ROC curve and AUC:

In [30]:
fpr, tpr, thresholds = roc_curve(error_df.true_class, error_df.reconstruction_error)
roc_auc = auc(fpr, tpr)

plt.title('Receiver Operating Characteristic')
plt.plot(fpr, tpr, label='AUC = %0.4f'% roc_auc)
plt.legend(loc='lower right')
plt.plot([0,1],[0,1],'r--')
plt.xlim([-0.001, 1])
plt.ylim([0, 1.001])
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
plt.show();

AUC for the autoencoder predictions is pretty high.

Prediction

To detect fraud based on prediction MSE select a high level quantile of the MSE sample that guarantees probability of type 1 error. Select 0.995 quantile of the reconstruction error for "normal" class.

In [31]:
threshold = normal_error_df.reconstruction_error.quantile(q=0.995)
threshold
Out[31]:
940091276.2037513

Plot all errors, normal and fraud cases marked, and the threshold:

In [62]:
groups = error_df.groupby('true_class')
fig, ax = plt.subplots()
for name, group in groups:
    if name == 1:
        MarkerSize = 7
        Color = 'orangered'
        Label = 'Fraud'
        Marker = 'd'
    else:
        MarkerSize = 3.5
        Color = 'b'
        Label = 'Normal'
        Marker = 'o'
    ax.plot(group.index, group.reconstruction_error, 
            linestyle='',
            color=Color,
            label=Label,
            ms=MarkerSize,
            marker=Marker)
ax.hlines(threshold, ax.get_xlim()[0], ax.get_xlim()[1], colors="r", zorder=100, label='Threshold')
ax.legend(loc='upper left', bbox_to_anchor=(0.95, 1))
# plt.title("Probabilities of fraud for different classes", fontsize=15)
plt.ylabel("Reconstruction Error", fontsize=15)
plt.xlabel("Data point index", fontsize=15)
plt.show();

To draw more precise conclusions calculate confusion matrix:

In [65]:
y_pred = [1 if e > threshold else 0 for e in error_df.reconstruction_error.values]
conf_matrix = confusion_matrix(error_df.true_class, y_pred)

plt.figure(figsize=(6, 4))
sns.heatmap(conf_matrix, xticklabels=LABELS, yticklabels=LABELS, annot=True, fmt="d");
plt.title("Confusion matrix", fontsize=15)
plt.ylabel('True class', fontsize=15)
plt.xlabel('Predicted class', fontsize=15)
plt.show()
In [34]:
cohen_kappa_score(error_df.true_class, y_pred),accuracy_score(error_df.true_class, y_pred)
Out[34]:
(0.6329472960111571, 0.933456561922366)

The model manages to detect many fraudulent cases with accuracy over 93%. However, because of extreme prevalence Cohen's kappa gives a much more conservative evaluation.

Graph Analysis

In [1]:
# load the package
from datetime import date
import numpy as np
import pandas as pd
import seaborn as sns

import matplotlib.pyplot as plt
import pickle
from sklearn import preprocessing 
import networkx as nx
from itertools import permutations
from itertools import count



plt.rcParams['figure.figsize'] = (8, 6)
In [2]:
# load the data
inpatient = pd.read_csv('../Train_Inpatientdata-1542865627584.csv')
outpatient = pd.read_csv('../Train_Outpatientdata-1542865627584.csv')
fraud = pd.read_csv('../Train-1542865627584.csv', index_col = 'Provider')

Merge Data

In [3]:
claims = inpatient.append(outpatient)
claims = claims.merge(fraud, how = 'left', on = 'Provider')
claims.head()
/Users/hank/anaconda3/lib/python3.7/site-packages/pandas/core/frame.py:7138: FutureWarning: Sorting because non-concatenation axis is not aligned. A future version
of pandas will change to not sort by default.

To accept the future behavior, pass 'sort=False'.

To retain the current behavior and silence the warning, pass 'sort=True'.

  sort=sort,
Out[3]:
AdmissionDt AttendingPhysician BeneID ClaimEndDt ClaimID ClaimStartDt ClmAdmitDiagnosisCode ClmDiagnosisCode_1 ClmDiagnosisCode_10 ClmDiagnosisCode_2 ... ClmProcedureCode_5 ClmProcedureCode_6 DeductibleAmtPaid DiagnosisGroupCode DischargeDt InscClaimAmtReimbursed OperatingPhysician OtherPhysician Provider PotentialFraud
0 2009-04-12 PHY390922 BENE11001 2009-04-18 CLM46614 2009-04-12 7866 1970 NaN 4019 ... NaN NaN 1068.0 201 2009-04-18 26000 NaN NaN PRV55912 Yes
1 2009-08-31 PHY318495 BENE11001 2009-09-02 CLM66048 2009-08-31 6186 6186 NaN 2948 ... NaN NaN 1068.0 750 2009-09-02 5000 PHY318495 NaN PRV55907 No
2 2009-09-17 PHY372395 BENE11001 2009-09-20 CLM68358 2009-09-17 29590 29623 NaN 30390 ... NaN NaN 1068.0 883 2009-09-20 5000 NaN PHY324689 PRV56046 No
3 2009-02-14 PHY369659 BENE11011 2009-02-22 CLM38412 2009-02-14 431 43491 NaN 2762 ... NaN NaN 1068.0 067 2009-02-22 5000 PHY392961 PHY349768 PRV52405 No
4 2009-08-13 PHY379376 BENE11014 2009-08-30 CLM63689 2009-08-13 78321 042 NaN 3051 ... NaN NaN 1068.0 975 2009-08-30 10000 PHY398258 NaN PRV56614 No

5 rows × 31 columns

In [4]:
claims = claims[['Provider', 'BeneID', 'OperatingPhysician',
        'AttendingPhysician', 'OtherPhysician','PotentialFraud']]
In [5]:
claims.head()
Out[5]:
Provider BeneID OperatingPhysician AttendingPhysician OtherPhysician PotentialFraud
0 PRV55912 BENE11001 NaN PHY390922 NaN Yes
1 PRV55907 BENE11001 PHY318495 PHY318495 NaN No
2 PRV56046 BENE11001 NaN PHY372395 PHY324689 No
3 PRV52405 BENE11011 PHY392961 PHY369659 PHY349768 No
4 PRV56614 BENE11014 PHY398258 PHY379376 NaN No
In [6]:
claims.shape
Out[6]:
(558211, 6)
In [7]:
claims
Out[7]:
Provider BeneID OperatingPhysician AttendingPhysician OtherPhysician PotentialFraud
0 PRV55912 BENE11001 NaN PHY390922 NaN Yes
1 PRV55907 BENE11001 PHY318495 PHY318495 NaN No
2 PRV56046 BENE11001 NaN PHY372395 PHY324689 No
3 PRV52405 BENE11011 PHY392961 PHY369659 PHY349768 No
4 PRV56614 BENE11014 PHY398258 PHY379376 NaN No
... ... ... ... ... ... ...
558206 PRV53699 BENE159198 PHY364188 PHY364188 PHY385752 No
558207 PRV53702 BENE159198 PHY332284 PHY423019 NaN No
558208 PRV53676 BENE159198 NaN PHY361063 NaN No
558209 PRV53689 BENE159198 NaN PHY403198 PHY419379 No
558210 PRV53689 BENE159198 NaN PHY419379 PHY419379 No

558211 rows × 6 columns

Group data

Based on Provider and Patient

In [8]:
ProviderRel = claims[['Provider','BeneID','PotentialFraud' ]]
In [9]:
ProviderRel.head()
Out[9]:
Provider BeneID PotentialFraud
0 PRV55912 BENE11001 Yes
1 PRV55907 BENE11001 No
2 PRV56046 BENE11001 No
3 PRV52405 BENE11011 No
4 PRV56614 BENE11014 No
In [10]:
ProviderRel.shape
Out[10]:
(558211, 3)

Similar Patients

In [17]:
Similar = claims[['Provider','BeneID']]
#[claims['PotentialFraud'] == 'Yes']
In [18]:
Similar = Similar.drop_duplicates()
In [19]:
Similar.head()
Out[19]:
Provider BeneID
0 PRV55912 BENE11001
1 PRV55907 BENE11001
2 PRV56046 BENE11001
3 PRV52405 BENE11011
4 PRV56614 BENE11014
In [20]:
Similar.shape
Out[20]:
(363300, 2)
In [21]:
top = Similar['BeneID'].value_counts().head(300)
top.head()
Out[21]:
BENE40202     20
BENE122118    19
BENE122143    17
BENE133498    17
BENE120090    17
Name: BeneID, dtype: int64
In [22]:
top.tail()
Out[22]:
BENE129540    11
BENE95399     11
BENE139412    11
BENE130052    11
BENE79385     11
Name: BeneID, dtype: int64
In [23]:
#Similar['BeneID'] 
Similar = Similar[Similar.BeneID.isin(top.index)]
In [24]:
Similar.shape
Out[24]:
(3776, 2)
In [25]:
ss = Similar.groupby('Provider')
In [26]:
count_dct = Similar.groupby('Provider').count().to_dict()
count_dct = count_dct.values()
In [27]:
unique_grp = Similar['Provider'].unique() # get the unique groups 
unique_atr = Similar['BeneID'].unique() # get the unique attributes
In [28]:
count_dct1 = Similar.groupby('Provider').count()
In [29]:
print(unique_grp.shape)
print(unique_atr.shape)
(1390,)
(300,)
In [30]:
combos = list(permutations(unique_grp, 2)) # get all combinations of the groups
comp_df = pd.DataFrame(data = (combos), columns = ['Group','LikeGroup']) # create the array to put comparison data into
comp_df['CommonWords'] = 0 
In [31]:
i = 1
for atr in unique_atr:
    print("i step: " + str(i))
    i = i + 1
    temp_df = Similar[Similar['BeneID'] == atr] # break dataframe into pieces that only contain the attribute being looked at during that iteration

    myl = list(permutations(temp_df['Provider'],2)) # returns the pairs that have the attribute in common as a tuple
    j = 0
    for comb in myl:
        comp_df.loc[(comp_df['Group'] == comb[0]) & (comp_df['LikeGroup'] == comb[1]), 'CommonWords'] += 1 # increments the CommonWords column where the Group column is equal to the first entry in the previously mentioned tuple, and the LikeGroup column is equal to the second entry.

k = 0     
print('i OVER')
#for key, val in count_dct.items(): # put the previously computed TotalCount into the comparison dataframe
#    print('k step:' + str(k))
#    comp_df.loc[comp_df['Provider'] == key, 'TotalCount'] = val

#comp_df['PCT'] = (comp_df['CommonWords'] * 100.0 / comp_df['TotalCount']).round()
comp_df1 = comp_df
comp_df1 = comp_df1.merge(fraud, how = 'left', left_on='Group', right_on='Provider')
comp_df1 = comp_df1.rename(columns={"PotentialFraud": "GroupFraud"})
comp_df1 = comp_df1.merge(fraud, how = 'left', left_on='LikeGroup', right_on='Provider')
comp_df1 = comp_df1.rename(columns={"PotentialFraud": "LikeGroupFraud"})

comp_df1 = comp_df1.merge(count_dct1, how = 'left', left_on='Group', right_on='Provider')
comp_df1 = comp_df1.rename(columns={"BeneID": "TotalGroup"})
comp_df1 = comp_df1.merge(count_dct1, how = 'left', left_on='LikeGroup', right_on='Provider')
comp_df1 = comp_df1.rename(columns={"BeneID": "TotalLikeGroup"})

comp_df1['PCT'] = (comp_df1['CommonWords'] * 100.0 / comp_df1['TotalGroup']).round()
i step: 1
i step: 2
i step: 3
i step: 4
i step: 5
i step: 6
i step: 7
i step: 8
i step: 9
i step: 10
i step: 11
i step: 12
i step: 13
i step: 14
i step: 15
i step: 16
i step: 17
i step: 18
i step: 19
i step: 20
i step: 21
i step: 22
i step: 23
i step: 24
i step: 25
i step: 26
i step: 27
i step: 28
i step: 29
i step: 30
i step: 31
i step: 32
i step: 33
i step: 34
i step: 35
i step: 36
i step: 37
i step: 38
i step: 39
i step: 40
i step: 41
i step: 42
i step: 43
i step: 44
i step: 45
i step: 46
i step: 47
i step: 48
i step: 49
i step: 50
i step: 51
i step: 52
i step: 53
i step: 54
i step: 55
i step: 56
i step: 57
i step: 58
i step: 59
i step: 60
i step: 61
i step: 62
i step: 63
i step: 64
i step: 65
i step: 66
i step: 67
i step: 68
i step: 69
i step: 70
i step: 71
i step: 72
i step: 73
i step: 74
i step: 75
i step: 76
i step: 77
i step: 78
i step: 79
i step: 80
i step: 81
i step: 82
i step: 83
i step: 84
i step: 85
i step: 86
i step: 87
i step: 88
i step: 89
i step: 90
i step: 91
i step: 92
i step: 93
i step: 94
i step: 95
i step: 96
i step: 97
i step: 98
i step: 99
i step: 100
i step: 101
i step: 102
i step: 103
i step: 104
i step: 105
i step: 106
i step: 107
i step: 108
i step: 109
i step: 110
i step: 111
i step: 112
i step: 113
i step: 114
i step: 115
i step: 116
i step: 117
i step: 118
i step: 119
i step: 120
i step: 121
i step: 122
i step: 123
i step: 124
i step: 125
i step: 126
i step: 127
i step: 128
i step: 129
i step: 130
i step: 131
i step: 132
i step: 133
i step: 134
i step: 135
i step: 136
i step: 137
i step: 138
i step: 139
i step: 140
i step: 141
i step: 142
i step: 143
i step: 144
i step: 145
i step: 146
i step: 147
i step: 148
i step: 149
i step: 150
i step: 151
i step: 152
i step: 153
i step: 154
i step: 155
i step: 156
i step: 157
i step: 158
i step: 159
i step: 160
i step: 161
i step: 162
i step: 163
i step: 164
i step: 165
i step: 166
i step: 167
i step: 168
i step: 169
i step: 170
i step: 171
i step: 172
i step: 173
i step: 174
i step: 175
i step: 176
i step: 177
i step: 178
i step: 179
i step: 180
i step: 181
i step: 182
i step: 183
i step: 184
i step: 185
i step: 186
i step: 187
i step: 188
i step: 189
i step: 190
i step: 191
i step: 192
i step: 193
i step: 194
i step: 195
i step: 196
i step: 197
i step: 198
i step: 199
i step: 200
i step: 201
i step: 202
i step: 203
i step: 204
i step: 205
i step: 206
i step: 207
i step: 208
i step: 209
i step: 210
i step: 211
i step: 212
i step: 213
i step: 214
i step: 215
i step: 216
i step: 217
i step: 218
i step: 219
i step: 220
i step: 221
i step: 222
i step: 223
i step: 224
i step: 225
i step: 226
i step: 227
i step: 228
i step: 229
i step: 230
i step: 231
i step: 232
i step: 233
i step: 234
i step: 235
i step: 236
i step: 237
i step: 238
i step: 239
i step: 240
i step: 241
i step: 242
i step: 243
i step: 244
i step: 245
i step: 246
i step: 247
i step: 248
i step: 249
i step: 250
i step: 251
i step: 252
i step: 253
i step: 254
i step: 255
i step: 256
i step: 257
i step: 258
i step: 259
i step: 260
i step: 261
i step: 262
i step: 263
i step: 264
i step: 265
i step: 266
i step: 267
i step: 268
i step: 269
i step: 270
i step: 271
i step: 272
i step: 273
i step: 274
i step: 275
i step: 276
i step: 277
i step: 278
i step: 279
i step: 280
i step: 281
i step: 282
i step: 283
i step: 284
i step: 285
i step: 286
i step: 287
i step: 288
i step: 289
i step: 290
i step: 291
i step: 292
i step: 293
i step: 294
i step: 295
i step: 296
i step: 297
i step: 298
i step: 299
i step: 300
i OVER
In [32]:
comp_df1.to_csv('BenProvData.csv')
In [71]:
comp_df1.sort_values('CommonWords', ascending=False).head(20)
Out[71]:
Group LikeGroup CommonWords GroupFraud LikeGroupFraud TotalGroup TotalLikeGroup PCT
418137 PRV51204 PRV51164 13 No No 18 16 72.0
65583 PRV51140 PRV51204 13 No No 17 18 76.0
66972 PRV51164 PRV51204 13 No No 16 18 81.0
462838 PRV51156 PRV51204 13 No No 16 18 81.0
418421 PRV51204 PRV51156 13 No No 18 16 72.0
418136 PRV51204 PRV51140 13 No No 18 17 72.0
462585 PRV51156 PRV51164 11 No No 16 16 69.0
65615 PRV51140 PRV51156 11 No No 17 16 65.0
462584 PRV51156 PRV51140 11 No No 16 17 69.0
67004 PRV51164 PRV51156 11 No No 16 16 69.0
12801 PRV51149 PRV51204 10 Yes No 11 18 91.0
554618 PRV52628 PRV52649 10 Yes Yes 12 17 83.0
12833 PRV51149 PRV51156 10 Yes No 11 16 91.0
567111 PRV52649 PRV52628 10 Yes Yes 17 12 59.0
462546 PRV51156 PRV51149 10 No Yes 16 11 62.0
418098 PRV51204 PRV51149 10 No Yes 18 11 56.0
432094 PRV52098 PRV55215 9 No Yes 17 38 53.0
160045 PRV55215 PRV52098 9 Yes No 38 17 24.0
556007 PRV52571 PRV52649 8 No Yes 9 17 89.0
556002 PRV52571 PRV52631 8 No No 9 9 89.0
In [72]:
Groups = comp_df1.sort_values('CommonWords', ascending=False).head(20)
In [73]:
Groups['Group'].unique()
Out[73]:
array(['PRV51204', 'PRV51140', 'PRV51164', 'PRV51156', 'PRV51149',
       'PRV52628', 'PRV52649', 'PRV52098', 'PRV55215', 'PRV52571'],
      dtype=object)
In [74]:
Groups['LikeGroup'].unique()
Out[74]:
array(['PRV51164', 'PRV51204', 'PRV51156', 'PRV51140', 'PRV52649',
       'PRV52628', 'PRV51149', 'PRV55215', 'PRV52098', 'PRV52631'],
      dtype=object)
In [75]:
newGroup = ProviderRel[(ProviderRel['Provider'].isin(Groups['Group'].unique())) |
            (ProviderRel['Provider'].isin(Groups['LikeGroup'].unique()))].drop_duplicates()
In [76]:
newGroup.head()
Out[76]:
Provider BeneID PotentialFraud
9 PRV55215 BENE11034 Yes
38 PRV51164 BENE11101 No
43 PRV51140 BENE11147 No
171 PRV51149 BENE11648 Yes
181 PRV55215 BENE11672 Yes
In [77]:
newGroup.shape
Out[77]:
(8768, 3)
In [78]:
FGa = nx.from_pandas_edgelist(newGroup, source='Provider',
                             target='BeneID')
In [79]:
fraud1 = fraud
fraud1 = fraud1.reset_index()
fraud1 = fraud1[fraud1['Provider'].isin(newGroup.Provider)].set_index('Provider')
In [80]:
nx.set_node_attributes(FGa, name = 'Fraud', values = pd.Series(fraud1.PotentialFraud).to_dict())
#nx.set_node_attributes(FGa, 'gender', pd.Series(nodes.gender, index=nodes.node).to_dict())
In [81]:
fraud1 = fraud
fraud1 = fraud1.reset_index()
fraud1 = fraud1[fraud1['Provider'].isin(newGroup.Provider)]
In [82]:
Ben = newGroup[['BeneID','PotentialFraud']]
Ben.PotentialFraud = 'Ben'
Ben = Ben.drop_duplicates()
Ben = Ben.rename(columns={"BeneID": "Provider"})
fraud2 = fraud1.append(Ben)
In [83]:
fraud2 = fraud2.set_index('Provider')
In [95]:
fraud2.head(20)
Out[95]:
PotentialFraud
Provider
PRV51140 No
PRV51149 Yes
PRV51156 No
PRV51164 No
PRV51204 No
PRV52098 No
PRV52571 No
PRV52628 Yes
PRV52631 No
PRV52649 Yes
PRV55215 Yes
BENE11034 Ben
BENE11101 Ben
BENE11147 Ben
BENE11648 Ben
BENE11672 Ben
BENE12033 Ben
BENE12101 Ben
BENE12549 Ben
BENE13018 Ben
In [84]:
nx.set_node_attributes(FGa, name = 'Fraud', values = pd.Series(fraud2.PotentialFraud).to_dict())
#nx.set_node_attributes(FGa, 'gender', pd.Series(nodes.gender, index=nodes.node).to_dict())
In [85]:
pd.Series(fraud2.PotentialFraud)
#.to_dict()
Out[85]:
Provider
PRV51140       No
PRV51149      Yes
PRV51156       No
PRV51164       No
PRV51204       No
             ... 
BENE158997    Ben
BENE159015    Ben
BENE159102    Ben
BENE159104    Ben
BENE159154    Ben
Name: PotentialFraud, Length: 6835, dtype: object
In [86]:
nx.get_node_attributes(FGa, 'Fraud')
Out[86]:
{'PRV55215': 'Yes',
 'BENE11034': 'Ben',
 'PRV51164': 'No',
 'BENE11101': 'Ben',
 'PRV51140': 'No',
 'BENE11147': 'Ben',
 'PRV51149': 'Yes',
 'BENE11648': 'Ben',
 'BENE11672': 'Ben',
 'BENE12033': 'Ben',
 'BENE12101': 'Ben',
 'BENE12549': 'Ben',
 'BENE13018': 'Ben',
 'BENE13123': 'Ben',
 'BENE13677': 'Ben',
 'BENE13923': 'Ben',
 'BENE14350': 'Ben',
 'BENE15276': 'Ben',
 'BENE15328': 'Ben',
 'BENE15362': 'Ben',
 'BENE15755': 'Ben',
 'BENE15954': 'Ben',
 'BENE16163': 'Ben',
 'BENE16214': 'Ben',
 'BENE17210': 'Ben',
 'BENE17395': 'Ben',
 'BENE17903': 'Ben',
 'BENE19061': 'Ben',
 'BENE19379': 'Ben',
 'BENE20353': 'Ben',
 'BENE21154': 'Ben',
 'BENE22067': 'Ben',
 'BENE22277': 'Ben',
 'BENE22436': 'Ben',
 'BENE22466': 'Ben',
 'BENE22556': 'Ben',
 'BENE22579': 'Ben',
 'BENE22586': 'Ben',
 'BENE23331': 'Ben',
 'BENE23979': 'Ben',
 'BENE25098': 'Ben',
 'BENE26163': 'Ben',
 'BENE27948': 'Ben',
 'BENE29521': 'Ben',
 'BENE29927': 'Ben',
 'BENE30140': 'Ben',
 'BENE30181': 'Ben',
 'BENE30377': 'Ben',
 'BENE30719': 'Ben',
 'BENE30941': 'Ben',
 'BENE31514': 'Ben',
 'BENE31692': 'Ben',
 'BENE32197': 'Ben',
 'BENE32418': 'Ben',
 'BENE32481': 'Ben',
 'BENE32879': 'Ben',
 'BENE32948': 'Ben',
 'BENE32952': 'Ben',
 'BENE33093': 'Ben',
 'BENE33227': 'Ben',
 'BENE34228': 'Ben',
 'BENE34478': 'Ben',
 'BENE35055': 'Ben',
 'BENE35058': 'Ben',
 'BENE35828': 'Ben',
 'BENE36235': 'Ben',
 'BENE36812': 'Ben',
 'BENE37589': 'Ben',
 'BENE37654': 'Ben',
 'BENE37850': 'Ben',
 'BENE37902': 'Ben',
 'BENE38489': 'Ben',
 'BENE38664': 'Ben',
 'BENE39431': 'Ben',
 'BENE43805': 'Ben',
 'BENE43885': 'Ben',
 'BENE43939': 'Ben',
 'BENE43981': 'Ben',
 'BENE44010': 'Ben',
 'BENE45239': 'Ben',
 'BENE45398': 'Ben',
 'BENE45529': 'Ben',
 'BENE46166': 'Ben',
 'BENE46587': 'Ben',
 'BENE46597': 'Ben',
 'BENE47804': 'Ben',
 'BENE49624': 'Ben',
 'BENE49694': 'Ben',
 'BENE50765': 'Ben',
 'BENE50899': 'Ben',
 'BENE51271': 'Ben',
 'BENE51903': 'Ben',
 'BENE52013': 'Ben',
 'BENE52072': 'Ben',
 'BENE52102': 'Ben',
 'BENE52978': 'Ben',
 'BENE53095': 'Ben',
 'BENE53395': 'Ben',
 'BENE54571': 'Ben',
 'BENE55594': 'Ben',
 'BENE55781': 'Ben',
 'BENE55979': 'Ben',
 'BENE56437': 'Ben',
 'BENE56483': 'Ben',
 'BENE56622': 'Ben',
 'BENE56670': 'Ben',
 'BENE57614': 'Ben',
 'BENE57629': 'Ben',
 'BENE57897': 'Ben',
 'BENE57931': 'Ben',
 'BENE59068': 'Ben',
 'BENE59152': 'Ben',
 'BENE60611': 'Ben',
 'BENE60850': 'Ben',
 'BENE61184': 'Ben',
 'BENE61389': 'Ben',
 'BENE62045': 'Ben',
 'BENE63935': 'Ben',
 'BENE64106': 'Ben',
 'BENE64460': 'Ben',
 'BENE65055': 'Ben',
 'BENE66432': 'Ben',
 'BENE66955': 'Ben',
 'BENE67109': 'Ben',
 'BENE68820': 'Ben',
 'BENE69314': 'Ben',
 'BENE69406': 'Ben',
 'BENE69557': 'Ben',
 'BENE69917': 'Ben',
 'BENE71579': 'Ben',
 'BENE72464': 'Ben',
 'BENE73159': 'Ben',
 'BENE73304': 'Ben',
 'BENE73367': 'Ben',
 'BENE73933': 'Ben',
 'BENE73998': 'Ben',
 'BENE74309': 'Ben',
 'BENE74705': 'Ben',
 'BENE74779': 'Ben',
 'BENE75258': 'Ben',
 'BENE75368': 'Ben',
 'BENE75399': 'Ben',
 'BENE76486': 'Ben',
 'BENE76730': 'Ben',
 'BENE76773': 'Ben',
 'BENE77400': 'Ben',
 'BENE77542': 'Ben',
 'BENE78587': 'Ben',
 'BENE79331': 'Ben',
 'BENE79507': 'Ben',
 'BENE79582': 'Ben',
 'BENE79955': 'Ben',
 'BENE80207': 'Ben',
 'BENE80250': 'Ben',
 'BENE80290': 'Ben',
 'BENE80600': 'Ben',
 'BENE81750': 'Ben',
 'BENE81868': 'Ben',
 'BENE82032': 'Ben',
 'BENE82161': 'Ben',
 'BENE82667': 'Ben',
 'BENE82933': 'Ben',
 'BENE83157': 'Ben',
 'BENE83532': 'Ben',
 'BENE83790': 'Ben',
 'BENE84585': 'Ben',
 'BENE84951': 'Ben',
 'BENE85548': 'Ben',
 'BENE85883': 'Ben',
 'BENE86073': 'Ben',
 'BENE87382': 'Ben',
 'BENE87573': 'Ben',
 'BENE87595': 'Ben',
 'BENE87602': 'Ben',
 'BENE87732': 'Ben',
 'BENE87981': 'Ben',
 'BENE88687': 'Ben',
 'BENE88725': 'Ben',
 'BENE88856': 'Ben',
 'BENE89001': 'Ben',
 'BENE89993': 'Ben',
 'BENE90095': 'Ben',
 'BENE90765': 'Ben',
 'BENE91033': 'Ben',
 'BENE91394': 'Ben',
 'BENE91400': 'Ben',
 'BENE91496': 'Ben',
 'BENE93259': 'Ben',
 'BENE93807': 'Ben',
 'BENE94630': 'Ben',
 'BENE94687': 'Ben',
 'BENE95013': 'Ben',
 'BENE96351': 'Ben',
 'BENE96411': 'Ben',
 'BENE98108': 'Ben',
 'BENE98144': 'Ben',
 'BENE98167': 'Ben',
 'BENE98184': 'Ben',
 'BENE99243': 'Ben',
 'BENE100574': 'Ben',
 'BENE100714': 'Ben',
 'BENE100930': 'Ben',
 'BENE101603': 'Ben',
 'BENE101726': 'Ben',
 'BENE101851': 'Ben',
 'BENE102161': 'Ben',
 'BENE102181': 'Ben',
 'BENE102451': 'Ben',
 'BENE102770': 'Ben',
 'BENE102874': 'Ben',
 'BENE103406': 'Ben',
 'BENE103557': 'Ben',
 'BENE103638': 'Ben',
 'BENE105765': 'Ben',
 'BENE106200': 'Ben',
 'BENE106979': 'Ben',
 'BENE107227': 'Ben',
 'BENE107266': 'Ben',
 'BENE107888': 'Ben',
 'BENE109800': 'Ben',
 'BENE109849': 'Ben',
 'BENE110834': 'Ben',
 'BENE111103': 'Ben',
 'BENE112814': 'Ben',
 'BENE113657': 'Ben',
 'BENE113968': 'Ben',
 'BENE115021': 'Ben',
 'BENE115199': 'Ben',
 'BENE115416': 'Ben',
 'BENE115852': 'Ben',
 'BENE115976': 'Ben',
 'BENE116345': 'Ben',
 'BENE116718': 'Ben',
 'BENE116787': 'Ben',
 'BENE117191': 'Ben',
 'BENE117771': 'Ben',
 'BENE117859': 'Ben',
 'BENE118800': 'Ben',
 'BENE120670': 'Ben',
 'BENE121060': 'Ben',
 'BENE121168': 'Ben',
 'BENE121193': 'Ben',
 'BENE121544': 'Ben',
 'BENE121731': 'Ben',
 'BENE122118': 'Ben',
 'BENE122350': 'Ben',
 'BENE122760': 'Ben',
 'BENE123507': 'Ben',
 'BENE123597': 'Ben',
 'BENE124804': 'Ben',
 'BENE125216': 'Ben',
 'BENE125503': 'Ben',
 'BENE125840': 'Ben',
 'BENE126526': 'Ben',
 'BENE127118': 'Ben',
 'BENE127480': 'Ben',
 'BENE129218': 'Ben',
 'BENE129399': 'Ben',
 'BENE129630': 'Ben',
 'BENE130085': 'Ben',
 'BENE130378': 'Ben',
 'BENE130736': 'Ben',
 'BENE132694': 'Ben',
 'BENE132951': 'Ben',
 'BENE133165': 'Ben',
 'BENE133307': 'Ben',
 'BENE133584': 'Ben',
 'BENE133642': 'Ben',
 'BENE134481': 'Ben',
 'BENE134565': 'Ben',
 'BENE135477': 'Ben',
 'BENE135507': 'Ben',
 'BENE135999': 'Ben',
 'BENE136279': 'Ben',
 'BENE137473': 'Ben',
 'BENE139407': 'Ben',
 'BENE140591': 'Ben',
 'BENE141479': 'Ben',
 'BENE142241': 'Ben',
 'BENE142597': 'Ben',
 'BENE143077': 'Ben',
 'BENE143313': 'Ben',
 'BENE144021': 'Ben',
 'BENE144777': 'Ben',
 'BENE144864': 'Ben',
 'BENE146248': 'Ben',
 'BENE146594': 'Ben',
 'BENE146674': 'Ben',
 'BENE146782': 'Ben',
 'BENE146931': 'Ben',
 'BENE146978': 'Ben',
 'BENE147019': 'Ben',
 'BENE147275': 'Ben',
 'BENE147534': 'Ben',
 'BENE147657': 'Ben',
 'BENE148613': 'Ben',
 'BENE148726': 'Ben',
 'BENE149385': 'Ben',
 'BENE150012': 'Ben',
 'BENE150699': 'Ben',
 'BENE150797': 'Ben',
 'BENE152057': 'Ben',
 'BENE152729': 'Ben',
 'BENE153458': 'Ben',
 'BENE153499': 'Ben',
 'BENE153519': 'Ben',
 'BENE153684': 'Ben',
 'BENE154004': 'Ben',
 'BENE154050': 'Ben',
 'BENE154499': 'Ben',
 'BENE154777': 'Ben',
 'BENE154992': 'Ben',
 'BENE155197': 'Ben',
 'BENE155362': 'Ben',
 'BENE155635': 'Ben',
 'BENE155876': 'Ben',
 'BENE157544': 'Ben',
 'BENE157736': 'Ben',
 'BENE158171': 'Ben',
 'BENE158507': 'Ben',
 'BENE158745': 'Ben',
 'BENE159005': 'Ben',
 'BENE159112': 'Ben',
 'PRV52631': 'No',
 'BENE11039': 'Ben',
 'PRV52098': 'No',
 'BENE11059': 'Ben',
 'PRV52649': 'Yes',
 'BENE11065': 'Ben',
 'BENE11084': 'Ben',
 'PRV51156': 'No',
 'PRV51204': 'No',
 'BENE11133': 'Ben',
 'BENE11183': 'Ben',
 'BENE11218': 'Ben',
 'BENE11224': 'Ben',
 'BENE11230': 'Ben',
 'BENE11251': 'Ben',
 'BENE11305': 'Ben',
 'BENE11312': 'Ben',
 'BENE11336': 'Ben',
 'BENE11346': 'Ben',
 'BENE11397': 'Ben',
 'PRV52628': 'Yes',
 'BENE11445': 'Ben',
 'PRV52571': 'No',
 'BENE11453': 'Ben',
 'BENE11456': 'Ben',
 'BENE11485': 'Ben',
 'BENE11502': 'Ben',
 'BENE11511': 'Ben',
 'BENE11558': 'Ben',
 'BENE11574': 'Ben',
 'BENE11604': 'Ben',
 'BENE11607': 'Ben',
 'BENE11632': 'Ben',
 'BENE11660': 'Ben',
 'BENE11665': 'Ben',
 'BENE11676': 'Ben',
 'BENE11693': 'Ben',
 'BENE11752': 'Ben',
 'BENE11755': 'Ben',
 'BENE11759': 'Ben',
 'BENE11774': 'Ben',
 'BENE11782': 'Ben',
 'BENE11798': 'Ben',
 'BENE11812': 'Ben',
 'BENE11826': 'Ben',
 'BENE11841': 'Ben',
 'BENE11843': 'Ben',
 'BENE11851': 'Ben',
 'BENE11888': 'Ben',
 'BENE11895': 'Ben',
 'BENE11912': 'Ben',
 'BENE11924': 'Ben',
 'BENE11930': 'Ben',
 'BENE11933': 'Ben',
 'BENE11950': 'Ben',
 'BENE11954': 'Ben',
 'BENE11961': 'Ben',
 'BENE12017': 'Ben',
 'BENE12036': 'Ben',
 'BENE12063': 'Ben',
 'BENE12149': 'Ben',
 'BENE12156': 'Ben',
 'BENE12169': 'Ben',
 'BENE12293': 'Ben',
 'BENE12303': 'Ben',
 'BENE12312': 'Ben',
 'BENE12339': 'Ben',
 'BENE12366': 'Ben',
 'BENE12368': 'Ben',
 'BENE12384': 'Ben',
 'BENE12416': 'Ben',
 'BENE12428': 'Ben',
 'BENE12443': 'Ben',
 'BENE12466': 'Ben',
 'BENE12479': 'Ben',
 'BENE12497': 'Ben',
 'BENE12529': 'Ben',
 'BENE12537': 'Ben',
 'BENE12577': 'Ben',
 'BENE12585': 'Ben',
 'BENE12586': 'Ben',
 'BENE12640': 'Ben',
 'BENE12652': 'Ben',
 'BENE12676': 'Ben',
 'BENE12744': 'Ben',
 'BENE12752': 'Ben',
 'BENE12780': 'Ben',
 'BENE12785': 'Ben',
 'BENE12818': 'Ben',
 'BENE12824': 'Ben',
 'BENE12830': 'Ben',
 'BENE12869': 'Ben',
 'BENE12879': 'Ben',
 'BENE12902': 'Ben',
 'BENE12922': 'Ben',
 'BENE12970': 'Ben',
 'BENE13001': 'Ben',
 'BENE13009': 'Ben',
 'BENE13011': 'Ben',
 'BENE13037': 'Ben',
 'BENE13042': 'Ben',
 'BENE13055': 'Ben',
 'BENE13075': 'Ben',
 'BENE13082': 'Ben',
 'BENE13109': 'Ben',
 'BENE13149': 'Ben',
 'BENE13164': 'Ben',
 'BENE13175': 'Ben',
 'BENE13205': 'Ben',
 'BENE13209': 'Ben',
 'BENE13219': 'Ben',
 'BENE13238': 'Ben',
 'BENE13254': 'Ben',
 'BENE13302': 'Ben',
 'BENE13321': 'Ben',
 'BENE13324': 'Ben',
 'BENE13329': 'Ben',
 'BENE13330': 'Ben',
 'BENE13336': 'Ben',
 'BENE13410': 'Ben',
 'BENE13594': 'Ben',
 'BENE13605': 'Ben',
 'BENE13651': 'Ben',
 'BENE13653': 'Ben',
 'BENE13656': 'Ben',
 'BENE13698': 'Ben',
 'BENE13729': 'Ben',
 'BENE13745': 'Ben',
 'BENE13753': 'Ben',
 'BENE13761': 'Ben',
 'BENE13798': 'Ben',
 'BENE13816': 'Ben',
 'BENE13908': 'Ben',
 'BENE13939': 'Ben',
 'BENE13969': 'Ben',
 'BENE13976': 'Ben',
 'BENE13989': 'Ben',
 'BENE13995': 'Ben',
 'BENE14128': 'Ben',
 'BENE14188': 'Ben',
 'BENE14194': 'Ben',
 'BENE14214': 'Ben',
 'BENE14226': 'Ben',
 'BENE14227': 'Ben',
 'BENE14242': 'Ben',
 'BENE14247': 'Ben',
 'BENE14262': 'Ben',
 'BENE14277': 'Ben',
 'BENE14296': 'Ben',
 'BENE14314': 'Ben',
 'BENE14361': 'Ben',
 'BENE14383': 'Ben',
 'BENE14395': 'Ben',
 'BENE14405': 'Ben',
 'BENE14410': 'Ben',
 'BENE14423': 'Ben',
 'BENE14429': 'Ben',
 'BENE14442': 'Ben',
 'BENE14564': 'Ben',
 'BENE14575': 'Ben',
 'BENE14576': 'Ben',
 'BENE14581': 'Ben',
 'BENE14595': 'Ben',
 'BENE14628': 'Ben',
 'BENE14638': 'Ben',
 'BENE14657': 'Ben',
 'BENE14661': 'Ben',
 'BENE14692': 'Ben',
 'BENE14717': 'Ben',
 'BENE14751': 'Ben',
 'BENE14759': 'Ben',
 'BENE14760': 'Ben',
 'BENE14805': 'Ben',
 'BENE14821': 'Ben',
 'BENE14849': 'Ben',
 'BENE14959': 'Ben',
 'BENE14983': 'Ben',
 'BENE15013': 'Ben',
 'BENE15014': 'Ben',
 'BENE15040': 'Ben',
 'BENE15066': 'Ben',
 'BENE15105': 'Ben',
 'BENE15124': 'Ben',
 'BENE15154': 'Ben',
 'BENE15156': 'Ben',
 'BENE15174': 'Ben',
 'BENE15182': 'Ben',
 'BENE15205': 'Ben',
 'BENE15219': 'Ben',
 'BENE15247': 'Ben',
 'BENE15264': 'Ben',
 'BENE15266': 'Ben',
 'BENE15274': 'Ben',
 'BENE15324': 'Ben',
 'BENE15330': 'Ben',
 'BENE15339': 'Ben',
 'BENE15357': 'Ben',
 'BENE15364': 'Ben',
 'BENE15365': 'Ben',
 'BENE15376': 'Ben',
 'BENE15380': 'Ben',
 'BENE15396': 'Ben',
 'BENE15429': 'Ben',
 'BENE15433': 'Ben',
 'BENE15468': 'Ben',
 'BENE15477': 'Ben',
 'BENE15489': 'Ben',
 'BENE15506': 'Ben',
 'BENE15514': 'Ben',
 'BENE15552': 'Ben',
 'BENE15558': 'Ben',
 'BENE15577': 'Ben',
 'BENE15586': 'Ben',
 'BENE15598': 'Ben',
 'BENE15695': 'Ben',
 'BENE15722': 'Ben',
 'BENE15765': 'Ben',
 'BENE15788': 'Ben',
 'BENE15802': 'Ben',
 'BENE15806': 'Ben',
 'BENE15832': 'Ben',
 'BENE15891': 'Ben',
 'BENE15973': 'Ben',
 'BENE15978': 'Ben',
 'BENE16019': 'Ben',
 'BENE16056': 'Ben',
 'BENE16059': 'Ben',
 'BENE16141': 'Ben',
 'BENE16170': 'Ben',
 'BENE16176': 'Ben',
 'BENE16184': 'Ben',
 'BENE16203': 'Ben',
 'BENE16220': 'Ben',
 'BENE16251': 'Ben',
 'BENE16304': 'Ben',
 'BENE16316': 'Ben',
 'BENE16353': 'Ben',
 'BENE16378': 'Ben',
 'BENE16385': 'Ben',
 'BENE16386': 'Ben',
 'BENE16499': 'Ben',
 'BENE16639': 'Ben',
 'BENE16684': 'Ben',
 'BENE16692': 'Ben',
 'BENE16707': 'Ben',
 'BENE16710': 'Ben',
 'BENE16725': 'Ben',
 'BENE16727': 'Ben',
 'BENE16753': 'Ben',
 'BENE16787': 'Ben',
 'BENE16814': 'Ben',
 'BENE16822': 'Ben',
 'BENE16867': 'Ben',
 'BENE16915': 'Ben',
 'BENE16941': 'Ben',
 'BENE16948': 'Ben',
 'BENE16956': 'Ben',
 'BENE16985': 'Ben',
 'BENE17001': 'Ben',
 'BENE17006': 'Ben',
 'BENE17035': 'Ben',
 'BENE17061': 'Ben',
 'BENE17090': 'Ben',
 'BENE17095': 'Ben',
 'BENE17132': 'Ben',
 'BENE17150': 'Ben',
 'BENE17165': 'Ben',
 'BENE17196': 'Ben',
 'BENE17200': 'Ben',
 'BENE17223': 'Ben',
 'BENE17225': 'Ben',
 'BENE17257': 'Ben',
 'BENE17274': 'Ben',
 'BENE17280': 'Ben',
 'BENE17281': 'Ben',
 'BENE17310': 'Ben',
 'BENE17313': 'Ben',
 'BENE17353': 'Ben',
 'BENE17363': 'Ben',
 'BENE17370': 'Ben',
 'BENE17390': 'Ben',
 'BENE17419': 'Ben',
 'BENE17451': 'Ben',
 'BENE17464': 'Ben',
 'BENE17468': 'Ben',
 'BENE17493': 'Ben',
 'BENE17495': 'Ben',
 'BENE17498': 'Ben',
 'BENE17507': 'Ben',
 'BENE17541': 'Ben',
 'BENE17600': 'Ben',
 'BENE17610': 'Ben',
 'BENE17669': 'Ben',
 'BENE17672': 'Ben',
 'BENE17676': 'Ben',
 'BENE17680': 'Ben',
 'BENE17689': 'Ben',
 'BENE17714': 'Ben',
 'BENE17732': 'Ben',
 'BENE17752': 'Ben',
 'BENE17760': 'Ben',
 'BENE17791': 'Ben',
 'BENE17849': 'Ben',
 'BENE17851': 'Ben',
 'BENE17924': 'Ben',
 'BENE17939': 'Ben',
 'BENE17940': 'Ben',
 'BENE17949': 'Ben',
 'BENE17959': 'Ben',
 'BENE18016': 'Ben',
 'BENE18034': 'Ben',
 'BENE18095': 'Ben',
 'BENE18126': 'Ben',
 'BENE18154': 'Ben',
 'BENE18176': 'Ben',
 'BENE18262': 'Ben',
 'BENE18296': 'Ben',
 'BENE18304': 'Ben',
 'BENE18361': 'Ben',
 'BENE18376': 'Ben',
 'BENE18397': 'Ben',
 'BENE18463': 'Ben',
 'BENE18480': 'Ben',
 'BENE18482': 'Ben',
 'BENE18483': 'Ben',
 'BENE18496': 'Ben',
 'BENE18509': 'Ben',
 'BENE18531': 'Ben',
 'BENE18542': 'Ben',
 'BENE18550': 'Ben',
 'BENE18595': 'Ben',
 'BENE18617': 'Ben',
 'BENE18639': 'Ben',
 'BENE18644': 'Ben',
 'BENE18669': 'Ben',
 'BENE18690': 'Ben',
 'BENE18704': 'Ben',
 'BENE18740': 'Ben',
 'BENE18791': 'Ben',
 'BENE18820': 'Ben',
 'BENE18824': 'Ben',
 'BENE18835': 'Ben',
 'BENE18869': 'Ben',
 'BENE18873': 'Ben',
 'BENE18916': 'Ben',
 'BENE18918': 'Ben',
 'BENE18919': 'Ben',
 'BENE18931': 'Ben',
 'BENE18936': 'Ben',
 'BENE18938': 'Ben',
 'BENE18940': 'Ben',
 'BENE18948': 'Ben',
 'BENE18967': 'Ben',
 'BENE18977': 'Ben',
 'BENE19069': 'Ben',
 'BENE19081': 'Ben',
 'BENE19099': 'Ben',
 'BENE19135': 'Ben',
 'BENE19152': 'Ben',
 'BENE19172': 'Ben',
 'BENE19174': 'Ben',
 'BENE19178': 'Ben',
 'BENE19181': 'Ben',
 'BENE19184': 'Ben',
 'BENE19196': 'Ben',
 'BENE19234': 'Ben',
 'BENE19288': 'Ben',
 'BENE19290': 'Ben',
 'BENE19318': 'Ben',
 'BENE19322': 'Ben',
 'BENE19343': 'Ben',
 'BENE19355': 'Ben',
 'BENE19408': 'Ben',
 'BENE19433': 'Ben',
 'BENE19448': 'Ben',
 'BENE19449': 'Ben',
 'BENE19492': 'Ben',
 'BENE19588': 'Ben',
 'BENE19604': 'Ben',
 'BENE19607': 'Ben',
 'BENE19631': 'Ben',
 'BENE19667': 'Ben',
 'BENE19669': 'Ben',
 'BENE19704': 'Ben',
 'BENE19713': 'Ben',
 'BENE19714': 'Ben',
 'BENE19716': 'Ben',
 'BENE19722': 'Ben',
 'BENE19726': 'Ben',
 'BENE19731': 'Ben',
 'BENE19759': 'Ben',
 'BENE19765': 'Ben',
 'BENE19810': 'Ben',
 'BENE19819': 'Ben',
 'BENE19845': 'Ben',
 'BENE19859': 'Ben',
 'BENE19908': 'Ben',
 'BENE19915': 'Ben',
 'BENE19930': 'Ben',
 'BENE19936': 'Ben',
 'BENE19967': 'Ben',
 'BENE19968': 'Ben',
 'BENE19976': 'Ben',
 'BENE19984': 'Ben',
 'BENE19990': 'Ben',
 'BENE20029': 'Ben',
 'BENE20039': 'Ben',
 'BENE20048': 'Ben',
 'BENE20080': 'Ben',
 'BENE20093': 'Ben',
 'BENE20103': 'Ben',
 'BENE20214': 'Ben',
 'BENE20219': 'Ben',
 'BENE20251': 'Ben',
 'BENE20319': 'Ben',
 'BENE20334': 'Ben',
 'BENE20338': 'Ben',
 'BENE20347': 'Ben',
 'BENE20414': 'Ben',
 'BENE20423': 'Ben',
 'BENE20435': 'Ben',
 'BENE20443': 'Ben',
 'BENE20476': 'Ben',
 'BENE20487': 'Ben',
 'BENE20547': 'Ben',
 'BENE20570': 'Ben',
 'BENE20588': 'Ben',
 'BENE20591': 'Ben',
 'BENE20593': 'Ben',
 'BENE20597': 'Ben',
 'BENE20630': 'Ben',
 'BENE20637': 'Ben',
 'BENE20740': 'Ben',
 'BENE20745': 'Ben',
 'BENE20752': 'Ben',
 'BENE20763': 'Ben',
 'BENE20766': 'Ben',
 'BENE20787': 'Ben',
 'BENE20809': 'Ben',
 'BENE20818': 'Ben',
 'BENE20831': 'Ben',
 'BENE20857': 'Ben',
 'BENE20875': 'Ben',
 'BENE20906': 'Ben',
 'BENE20920': 'Ben',
 'BENE20969': 'Ben',
 'BENE21039': 'Ben',
 'BENE21061': 'Ben',
 'BENE21062': 'Ben',
 'BENE21071': 'Ben',
 'BENE21074': 'Ben',
 'BENE21097': 'Ben',
 'BENE21103': 'Ben',
 'BENE21124': 'Ben',
 'BENE21129': 'Ben',
 'BENE21217': 'Ben',
 'BENE21246': 'Ben',
 'BENE21253': 'Ben',
 'BENE21288': 'Ben',
 'BENE21321': 'Ben',
 'BENE21342': 'Ben',
 'BENE21357': 'Ben',
 'BENE21375': 'Ben',
 'BENE21406': 'Ben',
 'BENE21431': 'Ben',
 'BENE21437': 'Ben',
 'BENE21464': 'Ben',
 'BENE21469': 'Ben',
 'BENE21476': 'Ben',
 'BENE21518': 'Ben',
 'BENE21537': 'Ben',
 'BENE21549': 'Ben',
 'BENE21563': 'Ben',
 'BENE21606': 'Ben',
 'BENE21617': 'Ben',
 'BENE21621': 'Ben',
 'BENE21622': 'Ben',
 'BENE21629': 'Ben',
 'BENE21639': 'Ben',
 'BENE21682': 'Ben',
 'BENE21686': 'Ben',
 'BENE21700': 'Ben',
 'BENE21729': 'Ben',
 'BENE21744': 'Ben',
 'BENE21751': 'Ben',
 'BENE21756': 'Ben',
 'BENE21765': 'Ben',
 'BENE21767': 'Ben',
 'BENE21802': 'Ben',
 'BENE21871': 'Ben',
 'BENE21875': 'Ben',
 'BENE21891': 'Ben',
 'BENE21947': 'Ben',
 'BENE21971': 'Ben',
 'BENE21986': 'Ben',
 'BENE21996': 'Ben',
 'BENE22000': 'Ben',
 'BENE22006': 'Ben',
 'BENE22010': 'Ben',
 'BENE22015': 'Ben',
 'BENE22017': 'Ben',
 'BENE22051': 'Ben',
 'BENE22070': 'Ben',
 'BENE22126': 'Ben',
 'BENE22200': 'Ben',
 'BENE22202': 'Ben',
 'BENE22210': 'Ben',
 'BENE22214': 'Ben',
 'BENE22261': 'Ben',
 'BENE22282': 'Ben',
 'BENE22293': 'Ben',
 'BENE22299': 'Ben',
 'BENE22305': 'Ben',
 'BENE22314': 'Ben',
 'BENE22325': 'Ben',
 'BENE22358': 'Ben',
 'BENE22363': 'Ben',
 'BENE22370': 'Ben',
 'BENE22377': 'Ben',
 'BENE22421': 'Ben',
 'BENE22491': 'Ben',
 'BENE22520': 'Ben',
 'BENE22546': 'Ben',
 'BENE22548': 'Ben',
 'BENE22555': 'Ben',
 'BENE22568': 'Ben',
 'BENE22583': 'Ben',
 'BENE22640': 'Ben',
 'BENE22648': 'Ben',
 'BENE22675': 'Ben',
 'BENE22676': 'Ben',
 'BENE22682': 'Ben',
 'BENE22684': 'Ben',
 'BENE22688': 'Ben',
 'BENE22694': 'Ben',
 'BENE22785': 'Ben',
 'BENE22801': 'Ben',
 'BENE22857': 'Ben',
 'BENE22878': 'Ben',
 'BENE22897': 'Ben',
 'BENE22915': 'Ben',
 'BENE22950': 'Ben',
 'BENE23008': 'Ben',
 'BENE23054': 'Ben',
 'BENE23066': 'Ben',
 'BENE23073': 'Ben',
 'BENE23092': 'Ben',
 'BENE23151': 'Ben',
 'BENE23170': 'Ben',
 'BENE23226': 'Ben',
 'BENE23235': 'Ben',
 'BENE23240': 'Ben',
 'BENE23249': 'Ben',
 'BENE23252': 'Ben',
 'BENE23255': 'Ben',
 'BENE23285': 'Ben',
 'BENE23290': 'Ben',
 'BENE23292': 'Ben',
 'BENE23297': 'Ben',
 'BENE23302': 'Ben',
 'BENE23325': 'Ben',
 'BENE23339': 'Ben',
 'BENE23365': 'Ben',
 'BENE23387': 'Ben',
 'BENE23396': 'Ben',
 'BENE23424': 'Ben',
 'BENE23434': 'Ben',
 'BENE23470': 'Ben',
 'BENE23506': 'Ben',
 'BENE23539': 'Ben',
 'BENE23546': 'Ben',
 'BENE23555': 'Ben',
 'BENE23584': 'Ben',
 'BENE23619': 'Ben',
 'BENE23644': 'Ben',
 'BENE23645': 'Ben',
 'BENE23677': 'Ben',
 'BENE23767': 'Ben',
 'BENE23837': 'Ben',
 'BENE23854': 'Ben',
 'BENE23919': 'Ben',
 'BENE23942': 'Ben',
 'BENE23958': 'Ben',
 'BENE23969': 'Ben',
 'BENE23981': 'Ben',
 'BENE24035': 'Ben',
 'BENE24043': 'Ben',
 'BENE24075': 'Ben',
 'BENE24098': 'Ben',
 'BENE24103': 'Ben',
 'BENE24122': 'Ben',
 'BENE24127': 'Ben',
 'BENE24155': 'Ben',
 'BENE24180': 'Ben',
 'BENE24187': 'Ben',
 'BENE24216': 'Ben',
 'BENE24251': 'Ben',
 'BENE24252': 'Ben',
 'BENE24288': 'Ben',
 'BENE24405': 'Ben',
 'BENE24469': 'Ben',
 'BENE24474': 'Ben',
 'BENE24497': 'Ben',
 'BENE24605': 'Ben',
 'BENE24609': 'Ben',
 'BENE24635': 'Ben',
 'BENE24641': 'Ben',
 'BENE24722': 'Ben',
 'BENE24731': 'Ben',
 'BENE24767': 'Ben',
 'BENE24769': 'Ben',
 'BENE24770': 'Ben',
 'BENE24782': 'Ben',
 'BENE24798': 'Ben',
 'BENE24843': 'Ben',
 'BENE24887': 'Ben',
 'BENE24909': 'Ben',
 'BENE24910': 'Ben',
 'BENE24968': 'Ben',
 'BENE25028': 'Ben',
 'BENE25033': 'Ben',
 'BENE25036': 'Ben',
 'BENE25056': 'Ben',
 'BENE25061': 'Ben',
 'BENE25119': 'Ben',
 'BENE25120': 'Ben',
 'BENE25163': 'Ben',
 'BENE25196': 'Ben',
 'BENE25201': 'Ben',
 'BENE25221': 'Ben',
 'BENE25235': 'Ben',
 'BENE25252': 'Ben',
 'BENE25284': 'Ben',
 'BENE25333': 'Ben',
 'BENE25335': 'Ben',
 'BENE25340': 'Ben',
 'BENE25390': 'Ben',
 'BENE25398': 'Ben',
 'BENE25417': 'Ben',
 'BENE25426': 'Ben',
 'BENE25437': 'Ben',
 'BENE25479': 'Ben',
 'BENE25481': 'Ben',
 'BENE25490': 'Ben',
 'BENE25504': 'Ben',
 'BENE25588': 'Ben',
 'BENE25600': 'Ben',
 'BENE25601': 'Ben',
 'BENE25634': 'Ben',
 'BENE25679': 'Ben',
 'BENE25695': 'Ben',
 'BENE25713': 'Ben',
 'BENE25715': 'Ben',
 'BENE25735': 'Ben',
 'BENE25751': 'Ben',
 'BENE25802': 'Ben',
 'BENE25830': 'Ben',
 'BENE25835': 'Ben',
 'BENE25841': 'Ben',
 'BENE25884': 'Ben',
 'BENE25905': 'Ben',
 'BENE25926': 'Ben',
 'BENE25957': 'Ben',
 'BENE25961': 'Ben',
 'BENE26010': 'Ben',
 'BENE26037': 'Ben',
 'BENE26070': 'Ben',
 'BENE26077': 'Ben',
 'BENE26082': 'Ben',
 'BENE26084': 'Ben',
 'BENE26090': 'Ben',
 'BENE26121': 'Ben',
 'BENE26158': 'Ben',
 'BENE26209': 'Ben',
 'BENE26291': 'Ben',
 'BENE26340': 'Ben',
 'BENE26377': 'Ben',
 ...}
In [87]:
len(FGa)
Out[87]:
6835
In [88]:
print(nx.info(FGa))
Name: 
Type: Graph
Number of nodes: 6835
Number of edges: 8768
Average degree:   2.5656
In [89]:
#FGa.nodes()
In [ ]:
FGa.node[n]['Fraud']
In [100]:
from itertools import count
plt.figure(figsize=(20,20))
# get unique groups
groups = set(nx.get_node_attributes(FGa,'Fraud').values())
mapping = dict(zip(sorted(groups),count()))
nodes = FGa.nodes()
colors = [mapping[FGa.node[n]['Fraud']] for n in nodes]

# drawing nodes and edges separately so we can capture collection for colobar
pos = nx.spring_layout(FGa)
ec = nx.draw_networkx_edges(FGa, pos, alpha=0.05)
nc = nx.draw_networkx_nodes(FGa, pos, nodelist=nodes, node_color=colors, 
                            with_labels=False, node_size=50, cmap=plt.cm.jet)
#plt.colorbar(nc)
plt.axis('off')
plt.show()
In [97]:
plt.figure(figsize=(20,20))
nx.draw(FGa, 
        with_labels = False,
        font_size = 5, 
        nodelist=nodes,
        node_color=colors,
        node_size = 200
       )   
plt.show()
In [ ]:
plt.figure(figsize=(10,8))
nx.draw(FGa, 
        with_labels = False,
        font_size = 5, 
        #node_color=['red', 'blue'],
        node_size = 10
       )   
plt.show()

Similar Providers

In [177]:
Similar = claims[['Provider','AttendingPhysician']]
#[claims['PotentialFraud'] == 'Yes']
In [178]:
Similar = Similar.drop_duplicates()
In [179]:
Similar.head()
Out[179]:
Provider AttendingPhysician
0 PRV55912 PHY390922
1 PRV55907 PHY318495
2 PRV56046 PHY372395
3 PRV52405 PHY369659
4 PRV56614 PHY379376
In [180]:
Similar.shape
Out[180]:
(88810, 2)
In [181]:
top = Similar['AttendingPhysician'].value_counts().head(2000)
top.head()
Out[181]:
PHY342165    9
PHY365132    8
PHY417254    7
PHY418551    6
PHY389249    6
Name: AttendingPhysician, dtype: int64
In [182]:
top.tail()
Out[182]:
PHY433667    2
PHY398825    2
PHY337634    2
PHY349540    2
PHY424128    2
Name: AttendingPhysician, dtype: int64
In [183]:
#Similar['BeneID'] 
Similar = Similar[Similar.AttendingPhysician.isin(top.index)]
In [184]:
Similar.shape
Out[184]:
(4623, 2)
In [185]:
ss = Similar.groupby('Provider')
In [186]:
count_dct = Similar.groupby('Provider').count().to_dict()
count_dct = count_dct.values()
In [187]:
unique_grp = Similar['Provider'].unique() # get the unique groups 
unique_atr = Similar['AttendingPhysician'].unique() # get the unique attributes
In [188]:
count_dct1 = Similar.groupby('Provider').count()
In [189]:
print(unique_grp.shape)
print(unique_atr.shape)
(2406,)
(2000,)
In [190]:
combos = list(permutations(unique_grp, 2)) # get all combinations of the groups
comp_df = pd.DataFrame(data = (combos), columns = ['Group','LikeGroup']) # create the array to put comparison data into
comp_df['CommonWords'] = 0 
In [191]:
i = 1
for atr in unique_atr:
    print("i step: " + str(i))
    i = i + 1
    temp_df = Similar[Similar['AttendingPhysician'] == atr] # break dataframe into pieces that only contain the attribute being looked at during that iteration

    myl = list(permutations(temp_df['Provider'],2)) # returns the pairs that have the attribute in common as a tuple
    j = 0
    for comb in myl:
        comp_df.loc[(comp_df['Group'] == comb[0]) & (comp_df['LikeGroup'] == comb[1]), 'CommonWords'] += 1 # increments the CommonWords column where the Group column is equal to the first entry in the previously mentioned tuple, and the LikeGroup column is equal to the second entry.

k = 0     
print('i OVER')
#for key, val in count_dct.items(): # put the previously computed TotalCount into the comparison dataframe
#    print('k step:' + str(k))
#    comp_df.loc[comp_df['Provider'] == key, 'TotalCount'] = val

#comp_df['PCT'] = (comp_df['CommonWords'] * 100.0 / comp_df['TotalCount']).round()
comp_df1 = comp_df
comp_df1 = comp_df1.merge(fraud, how = 'left', left_on='Group', right_on='Provider')
comp_df1 = comp_df1.rename(columns={"PotentialFraud": "GroupFraud"})
comp_df1 = comp_df1.merge(fraud, how = 'left', left_on='LikeGroup', right_on='Provider')
comp_df1 = comp_df1.rename(columns={"PotentialFraud": "LikeGroupFraud"})

comp_df1 = comp_df1.merge(count_dct1, how = 'left', left_on='Group', right_on='Provider')
comp_df1 = comp_df1.rename(columns={"AttendingPhysician": "TotalGroup"})
comp_df1 = comp_df1.merge(count_dct1, how = 'left', left_on='LikeGroup', right_on='Provider')
comp_df1 = comp_df1.rename(columns={"AttendingPhysician": "TotalLikeGroup"})

comp_df1['PCT'] = (comp_df1['CommonWords'] * 100.0 / comp_df1['TotalGroup']).round()
i step: 1
i step: 2
i step: 3
i step: 4
i step: 5
i step: 6
i step: 7
i step: 8
i step: 9
i step: 10
i step: 11
i step: 12
i step: 13
i step: 14
i step: 15
i step: 16
i step: 17
i step: 18
i step: 19
i step: 20
i step: 21
i step: 22
i step: 23
i step: 24
i step: 25
i step: 26
i step: 27
i step: 28
i step: 29
i step: 30
i step: 31
i step: 32
i step: 33
i step: 34
i step: 35
i step: 36
i step: 37
i step: 38
i step: 39
i step: 40
i step: 41
i step: 42
i step: 43
i step: 44
i step: 45
i step: 46
i step: 47
i step: 48
i step: 49
i step: 50
i step: 51
i step: 52
i step: 53
i step: 54
i step: 55
i step: 56
i step: 57
i step: 58
i step: 59
i step: 60
i step: 61
i step: 62
i step: 63
i step: 64
i step: 65
i step: 66
i step: 67
i step: 68
i step: 69
i step: 70
i step: 71
i step: 72
i step: 73
i step: 74
i step: 75
i step: 76
i step: 77
i step: 78
i step: 79
i step: 80
i step: 81
i step: 82
i step: 83
i step: 84
i step: 85
i step: 86
i step: 87
i step: 88
i step: 89
i step: 90
i step: 91
i step: 92
i step: 93
i step: 94
i step: 95
i step: 96
i step: 97
i step: 98
i step: 99
i step: 100
i step: 101
i step: 102
i step: 103
i step: 104
i step: 105
i step: 106
i step: 107
i step: 108
i step: 109
i step: 110
i step: 111
i step: 112
i step: 113
i step: 114
i step: 115
i step: 116
i step: 117
i step: 118
i step: 119
i step: 120
i step: 121
i step: 122
i step: 123
i step: 124
i step: 125
i step: 126
i step: 127
i step: 128
i step: 129
i step: 130
i step: 131
i step: 132
i step: 133
i step: 134
i step: 135
i step: 136
i step: 137
i step: 138
i step: 139
i step: 140
i step: 141
i step: 142
i step: 143
i step: 144
i step: 145
i step: 146
i step: 147
i step: 148
i step: 149
i step: 150
i step: 151
i step: 152
i step: 153
i step: 154
i step: 155
i step: 156
i step: 157
i step: 158
i step: 159
i step: 160
i step: 161
i step: 162
i step: 163
i step: 164
i step: 165
i step: 166
i step: 167
i step: 168
i step: 169
i step: 170
i step: 171
i step: 172
i step: 173
i step: 174
i step: 175
i step: 176
i step: 177
i step: 178
i step: 179
i step: 180
i step: 181
i step: 182
i step: 183
i step: 184
i step: 185
i step: 186
i step: 187
i step: 188
i step: 189
i step: 190
i step: 191
i step: 192
i step: 193
i step: 194
i step: 195
i step: 196
i step: 197
i step: 198
i step: 199
i step: 200
i step: 201
i step: 202
i step: 203
i step: 204
i step: 205
i step: 206
i step: 207
i step: 208
i step: 209
i step: 210
i step: 211
i step: 212
i step: 213
i step: 214
i step: 215
i step: 216
i step: 217
i step: 218
i step: 219
i step: 220
i step: 221
i step: 222
i step: 223
i step: 224
i step: 225
i step: 226
i step: 227
i step: 228
i step: 229
i step: 230
i step: 231
i step: 232
i step: 233
i step: 234
i step: 235
i step: 236
i step: 237
i step: 238
i step: 239
i step: 240
i step: 241
i step: 242
i step: 243
i step: 244
i step: 245
i step: 246
i step: 247
i step: 248
i step: 249
i step: 250
i step: 251
i step: 252
i step: 253
i step: 254
i step: 255
i step: 256
i step: 257
i step: 258
i step: 259
i step: 260
i step: 261
i step: 262
i step: 263
i step: 264
i step: 265
i step: 266
i step: 267
i step: 268
i step: 269
i step: 270
i step: 271
i step: 272
i step: 273
i step: 274
i step: 275
i step: 276
i step: 277
i step: 278
i step: 279
i step: 280
i step: 281
i step: 282
i step: 283
i step: 284
i step: 285
i step: 286
i step: 287
i step: 288
i step: 289
i step: 290
i step: 291
i step: 292
i step: 293
i step: 294
i step: 295
i step: 296
i step: 297
i step: 298
i step: 299
i step: 300
i step: 301
i step: 302
i step: 303
i step: 304
i step: 305
i step: 306
i step: 307
i step: 308
i step: 309
i step: 310
i step: 311
i step: 312
i step: 313
i step: 314
i step: 315
i step: 316
i step: 317
i step: 318
i step: 319
i step: 320
i step: 321
i step: 322
i step: 323
i step: 324
i step: 325
i step: 326
i step: 327
i step: 328
i step: 329
i step: 330
i step: 331
i step: 332
i step: 333
i step: 334
i step: 335
i step: 336
i step: 337
i step: 338
i step: 339
i step: 340
i step: 341
i step: 342
i step: 343
i step: 344
i step: 345
i step: 346
i step: 347
i step: 348
i step: 349
i step: 350
i step: 351
i step: 352
i step: 353
i step: 354
i step: 355
i step: 356
i step: 357
i step: 358
i step: 359
i step: 360
i step: 361
i step: 362
i step: 363
i step: 364
i step: 365
i step: 366
i step: 367
i step: 368
i step: 369
i step: 370
i step: 371
i step: 372
i step: 373
i step: 374
i step: 375
i step: 376
i step: 377
i step: 378
i step: 379
i step: 380
i step: 381
i step: 382
i step: 383
i step: 384
i step: 385
i step: 386
i step: 387
i step: 388
i step: 389
i step: 390
i step: 391
i step: 392
i step: 393
i step: 394
i step: 395
i step: 396
i step: 397
i step: 398
i step: 399
i step: 400
i step: 401
i step: 402
i step: 403
i step: 404
i step: 405
i step: 406
i step: 407
i step: 408
i step: 409
i step: 410
i step: 411
i step: 412
i step: 413
i step: 414
i step: 415
i step: 416
i step: 417
i step: 418
i step: 419
i step: 420
i step: 421
i step: 422
i step: 423
i step: 424
i step: 425
i step: 426
i step: 427
i step: 428
i step: 429
i step: 430
i step: 431
i step: 432
i step: 433
i step: 434
i step: 435
i step: 436
i step: 437
i step: 438
i step: 439
i step: 440
i step: 441
i step: 442
i step: 443
i step: 444
i step: 445
i step: 446
i step: 447
i step: 448
i step: 449
i step: 450
i step: 451
i step: 452
i step: 453
i step: 454
i step: 455
i step: 456
i step: 457
i step: 458
i step: 459
i step: 460
i step: 461
i step: 462
i step: 463
i step: 464
i step: 465
i step: 466
i step: 467
i step: 468
i step: 469
i step: 470
i step: 471
i step: 472
i step: 473
i step: 474
i step: 475
i step: 476
i step: 477
i step: 478
i step: 479
i step: 480
i step: 481
i step: 482
i step: 483
i step: 484
i step: 485
i step: 486
i step: 487
i step: 488
i step: 489
i step: 490
i step: 491
i step: 492
i step: 493
i step: 494
i step: 495
i step: 496
i step: 497
i step: 498
i step: 499
i step: 500
i step: 501
i step: 502
i step: 503
i step: 504
i step: 505
i step: 506
i step: 507
i step: 508
i step: 509
i step: 510
i step: 511
i step: 512
i step: 513
i step: 514
i step: 515
i step: 516
i step: 517
i step: 518
i step: 519
i step: 520
i step: 521
i step: 522
i step: 523
i step: 524
i step: 525
i step: 526
i step: 527
i step: 528
i step: 529
i step: 530
i step: 531
i step: 532
i step: 533
i step: 534
i step: 535
i step: 536
i step: 537
i step: 538
i step: 539
i step: 540
i step: 541
i step: 542
i step: 543
i step: 544
i step: 545
i step: 546
i step: 547
i step: 548
i step: 549
i step: 550
i step: 551
i step: 552
i step: 553
i step: 554
i step: 555
i step: 556
i step: 557
i step: 558
i step: 559
i step: 560
i step: 561
i step: 562
i step: 563
i step: 564
i step: 565
i step: 566
i step: 567
i step: 568
i step: 569
i step: 570
i step: 571
i step: 572
i step: 573
i step: 574
i step: 575
i step: 576
i step: 577
i step: 578
i step: 579
i step: 580
i step: 581
i step: 582
i step: 583
i step: 584
i step: 585
i step: 586
i step: 587
i step: 588
i step: 589
i step: 590
i step: 591
i step: 592
i step: 593
i step: 594
i step: 595
i step: 596
i step: 597
i step: 598
i step: 599
i step: 600
i step: 601
i step: 602
i step: 603
i step: 604
i step: 605
i step: 606
i step: 607
i step: 608
i step: 609
i step: 610
i step: 611
i step: 612
i step: 613
i step: 614
i step: 615
i step: 616
i step: 617
i step: 618
i step: 619
i step: 620
i step: 621
i step: 622
i step: 623
i step: 624
i step: 625
i step: 626
i step: 627
i step: 628
i step: 629
i step: 630
i step: 631
i step: 632
i step: 633
i step: 634
i step: 635
i step: 636
i step: 637
i step: 638
i step: 639
i step: 640
i step: 641
i step: 642
i step: 643
i step: 644
i step: 645
i step: 646
i step: 647
i step: 648
i step: 649
i step: 650
i step: 651
i step: 652
i step: 653
i step: 654
i step: 655
i step: 656
i step: 657
i step: 658
i step: 659
i step: 660
i step: 661
i step: 662
i step: 663
i step: 664
i step: 665
i step: 666
i step: 667
i step: 668
i step: 669
i step: 670
i step: 671
i step: 672
i step: 673
i step: 674
i step: 675
i step: 676
i step: 677
i step: 678
i step: 679
i step: 680
i step: 681
i step: 682
i step: 683
i step: 684
i step: 685
i step: 686
i step: 687
i step: 688
i step: 689
i step: 690
i step: 691
i step: 692
i step: 693
i step: 694
i step: 695
i step: 696
i step: 697
i step: 698
i step: 699
i step: 700
i step: 701
i step: 702
i step: 703
i step: 704
i step: 705
i step: 706
i step: 707
i step: 708
i step: 709
i step: 710
i step: 711
i step: 712
i step: 713
i step: 714
i step: 715
i step: 716
i step: 717
i step: 718
i step: 719
i step: 720
i step: 721
i step: 722
i step: 723
i step: 724
i step: 725
i step: 726
i step: 727
i step: 728
i step: 729
i step: 730
i step: 731
i step: 732
i step: 733
i step: 734
i step: 735
i step: 736
i step: 737
i step: 738
i step: 739
i step: 740
i step: 741
i step: 742
i step: 743
i step: 744
i step: 745
i step: 746
i step: 747
i step: 748
i step: 749
i step: 750
i step: 751
i step: 752
i step: 753
i step: 754
i step: 755
i step: 756
i step: 757
i step: 758
i step: 759
i step: 760
i step: 761
i step: 762
i step: 763
i step: 764
i step: 765
i step: 766
i step: 767
i step: 768
i step: 769
i step: 770
i step: 771
i step: 772
i step: 773
i step: 774
i step: 775
i step: 776
i step: 777
i step: 778
i step: 779
i step: 780
i step: 781
i step: 782
i step: 783
i step: 784
i step: 785
i step: 786
i step: 787
i step: 788
i step: 789
i step: 790
i step: 791
i step: 792
i step: 793
i step: 794
i step: 795
i step: 796
i step: 797
i step: 798
i step: 799
i step: 800
i step: 801
i step: 802
i step: 803
i step: 804
i step: 805
i step: 806
i step: 807
i step: 808
i step: 809
i step: 810
i step: 811
i step: 812
i step: 813
i step: 814
i step: 815
i step: 816
i step: 817
i step: 818
i step: 819
i step: 820
i step: 821
i step: 822
i step: 823
i step: 824
i step: 825
i step: 826
i step: 827
i step: 828
i step: 829
i step: 830
i step: 831
i step: 832
i step: 833
i step: 834
i step: 835
i step: 836
i step: 837
i step: 838
i step: 839
i step: 840
i step: 841
i step: 842
i step: 843
i step: 844
i step: 845
i step: 846
i step: 847
i step: 848
i step: 849
i step: 850
i step: 851
i step: 852
i step: 853
i step: 854
i step: 855
i step: 856
i step: 857
i step: 858
i step: 859
i step: 860
i step: 861
i step: 862
i step: 863
i step: 864
i step: 865
i step: 866
i step: 867
i step: 868
i step: 869
i step: 870
i step: 871
i step: 872
i step: 873
i step: 874
i step: 875
i step: 876
i step: 877
i step: 878
i step: 879
i step: 880
i step: 881
i step: 882
i step: 883
i step: 884
i step: 885
i step: 886
i step: 887
i step: 888
i step: 889
i step: 890
i step: 891
i step: 892
i step: 893
i step: 894
i step: 895
i step: 896
i step: 897
i step: 898
i step: 899
i step: 900
i step: 901
i step: 902
i step: 903
i step: 904
i step: 905
i step: 906
i step: 907
i step: 908
i step: 909
i step: 910
i step: 911
i step: 912
i step: 913
i step: 914
i step: 915
i step: 916
i step: 917
i step: 918
i step: 919
i step: 920
i step: 921
i step: 922
i step: 923
i step: 924
i step: 925
i step: 926
i step: 927
i step: 928
i step: 929
i step: 930
i step: 931
i step: 932
i step: 933
i step: 934
i step: 935
i step: 936
i step: 937
i step: 938
i step: 939
i step: 940
i step: 941
i step: 942
i step: 943
i step: 944
i step: 945
i step: 946
i step: 947
i step: 948
i step: 949
i step: 950
i step: 951
i step: 952
i step: 953
i step: 954
i step: 955
i step: 956
i step: 957
i step: 958
i step: 959
i step: 960
i step: 961
i step: 962
i step: 963
i step: 964
i step: 965
i step: 966
i step: 967
i step: 968
i step: 969
i step: 970
i step: 971
i step: 972
i step: 973
i step: 974
i step: 975
i step: 976
i step: 977
i step: 978
i step: 979
i step: 980
i step: 981
i step: 982
i step: 983
i step: 984
i step: 985
i step: 986
i step: 987
i step: 988
i step: 989
i step: 990
i step: 991
i step: 992
i step: 993
i step: 994
i step: 995
i step: 996
i step: 997
i step: 998
i step: 999
i step: 1000
i step: 1001
i step: 1002
i step: 1003
i step: 1004
i step: 1005
i step: 1006
i step: 1007
i step: 1008
i step: 1009
i step: 1010
i step: 1011
i step: 1012
i step: 1013
i step: 1014
i step: 1015
i step: 1016
i step: 1017
i step: 1018
i step: 1019
i step: 1020
i step: 1021
i step: 1022
i step: 1023
i step: 1024
i step: 1025
i step: 1026
i step: 1027
i step: 1028
i step: 1029
i step: 1030
i step: 1031
i step: 1032
i step: 1033
i step: 1034
i step: 1035
i step: 1036
i step: 1037
i step: 1038
i step: 1039
i step: 1040
i step: 1041
i step: 1042
i step: 1043
i step: 1044
i step: 1045
i step: 1046
i step: 1047
i step: 1048
i step: 1049
i step: 1050
i step: 1051
i step: 1052
i step: 1053
i step: 1054
i step: 1055
i step: 1056
i step: 1057
i step: 1058
i step: 1059
i step: 1060
i step: 1061
i step: 1062
i step: 1063
i step: 1064
i step: 1065
i step: 1066
i step: 1067
i step: 1068
i step: 1069
i step: 1070
i step: 1071
i step: 1072
i step: 1073
i step: 1074
i step: 1075
i step: 1076
i step: 1077
i step: 1078
i step: 1079
i step: 1080
i step: 1081
i step: 1082
i step: 1083
i step: 1084
i step: 1085
i step: 1086
i step: 1087
i step: 1088
i step: 1089
i step: 1090
i step: 1091
i step: 1092
i step: 1093
i step: 1094
i step: 1095
i step: 1096
i step: 1097
i step: 1098
i step: 1099
i step: 1100
i step: 1101
i step: 1102
i step: 1103
i step: 1104
i step: 1105
i step: 1106
i step: 1107
i step: 1108
i step: 1109
i step: 1110
i step: 1111
i step: 1112
i step: 1113
i step: 1114
i step: 1115
i step: 1116
i step: 1117
i step: 1118
i step: 1119
i step: 1120
i step: 1121
i step: 1122
i step: 1123
i step: 1124
i step: 1125
i step: 1126
i step: 1127
i step: 1128
i step: 1129
i step: 1130
i step: 1131
i step: 1132
i step: 1133
i step: 1134
i step: 1135
i step: 1136
i step: 1137
i step: 1138
i step: 1139
i step: 1140
i step: 1141
i step: 1142
i step: 1143
i step: 1144
i step: 1145
i step: 1146
i step: 1147
i step: 1148
i step: 1149
i step: 1150
i step: 1151
i step: 1152
i step: 1153
i step: 1154
i step: 1155
i step: 1156
i step: 1157
i step: 1158
i step: 1159
i step: 1160
i step: 1161
i step: 1162
i step: 1163
i step: 1164
i step: 1165
i step: 1166
i step: 1167
i step: 1168
i step: 1169
i step: 1170
i step: 1171
i step: 1172
i step: 1173
i step: 1174
i step: 1175
i step: 1176
i step: 1177
i step: 1178
i step: 1179
i step: 1180
i step: 1181
i step: 1182
i step: 1183
i step: 1184
i step: 1185
i step: 1186
i step: 1187
i step: 1188
i step: 1189
i step: 1190
i step: 1191
i step: 1192
i step: 1193
i step: 1194
i step: 1195
i step: 1196
i step: 1197
i step: 1198
i step: 1199
i step: 1200
i step: 1201
i step: 1202
i step: 1203
i step: 1204
i step: 1205
i step: 1206
i step: 1207
i step: 1208
i step: 1209
i step: 1210
i step: 1211
i step: 1212
i step: 1213
i step: 1214
i step: 1215
i step: 1216
i step: 1217
i step: 1218
i step: 1219
i step: 1220
i step: 1221
i step: 1222
i step: 1223
i step: 1224
i step: 1225
i step: 1226
i step: 1227
i step: 1228
i step: 1229
i step: 1230
i step: 1231
i step: 1232
i step: 1233
i step: 1234
i step: 1235
i step: 1236
i step: 1237
i step: 1238
i step: 1239
i step: 1240
i step: 1241
i step: 1242
i step: 1243
i step: 1244
i step: 1245
i step: 1246
i step: 1247
i step: 1248
i step: 1249
i step: 1250
i step: 1251
i step: 1252
i step: 1253
i step: 1254
i step: 1255
i step: 1256
i step: 1257
i step: 1258
i step: 1259
i step: 1260
i step: 1261
i step: 1262
i step: 1263
i step: 1264
i step: 1265
i step: 1266
i step: 1267
i step: 1268
i step: 1269
i step: 1270
i step: 1271
i step: 1272
i step: 1273
i step: 1274
i step: 1275
i step: 1276
i step: 1277
i step: 1278
i step: 1279
i step: 1280
i step: 1281
i step: 1282
i step: 1283
i step: 1284
i step: 1285
i step: 1286
i step: 1287
i step: 1288
i step: 1289
i step: 1290
i step: 1291
i step: 1292
i step: 1293
i step: 1294
i step: 1295
i step: 1296
i step: 1297
i step: 1298
i step: 1299
i step: 1300
i step: 1301
i step: 1302
i step: 1303
i step: 1304
i step: 1305
i step: 1306
i step: 1307
i step: 1308
i step: 1309
i step: 1310
i step: 1311
i step: 1312
i step: 1313
i step: 1314
i step: 1315
i step: 1316
i step: 1317
i step: 1318
i step: 1319
i step: 1320
i step: 1321
i step: 1322
i step: 1323
i step: 1324
i step: 1325
i step: 1326
i step: 1327
i step: 1328
i step: 1329
i step: 1330
i step: 1331
i step: 1332
i step: 1333
i step: 1334
i step: 1335
i step: 1336
i step: 1337
i step: 1338
i step: 1339
i step: 1340
i step: 1341
i step: 1342
i step: 1343
i step: 1344
i step: 1345
i step: 1346
i step: 1347
i step: 1348
i step: 1349
i step: 1350
i step: 1351
i step: 1352
i step: 1353
i step: 1354
i step: 1355
i step: 1356
i step: 1357
i step: 1358
i step: 1359
i step: 1360
i step: 1361
i step: 1362
i step: 1363
i step: 1364
i step: 1365
i step: 1366
i step: 1367
i step: 1368
i step: 1369
i step: 1370
i step: 1371
i step: 1372
i step: 1373
i step: 1374
i step: 1375
i step: 1376
i step: 1377
i step: 1378
i step: 1379
i step: 1380
i step: 1381
i step: 1382
i step: 1383
i step: 1384
i step: 1385
i step: 1386
i step: 1387
i step: 1388
i step: 1389
i step: 1390
i step: 1391
i step: 1392
i step: 1393
i step: 1394
i step: 1395
i step: 1396
i step: 1397
i step: 1398
i step: 1399
i step: 1400
i step: 1401
i step: 1402
i step: 1403
i step: 1404
i step: 1405
i step: 1406
i step: 1407
i step: 1408
i step: 1409
i step: 1410
i step: 1411
i step: 1412
i step: 1413
i step: 1414
i step: 1415
i step: 1416
i step: 1417
i step: 1418
i step: 1419
i step: 1420
i step: 1421
i step: 1422
i step: 1423
i step: 1424
i step: 1425
i step: 1426
i step: 1427
i step: 1428
i step: 1429
i step: 1430
i step: 1431
i step: 1432
i step: 1433
i step: 1434
i step: 1435
i step: 1436
i step: 1437
i step: 1438
i step: 1439
i step: 1440
i step: 1441
i step: 1442
i step: 1443
i step: 1444
i step: 1445
i step: 1446
i step: 1447
i step: 1448
i step: 1449
i step: 1450
i step: 1451
i step: 1452
i step: 1453
i step: 1454
i step: 1455
i step: 1456
i step: 1457
i step: 1458
i step: 1459
i step: 1460
i step: 1461
i step: 1462
i step: 1463
i step: 1464
i step: 1465
i step: 1466
i step: 1467
i step: 1468
i step: 1469
i step: 1470
i step: 1471
i step: 1472
i step: 1473
i step: 1474
i step: 1475
i step: 1476
i step: 1477
i step: 1478
i step: 1479
i step: 1480
i step: 1481
i step: 1482
i step: 1483
i step: 1484
i step: 1485
i step: 1486
i step: 1487
i step: 1488
i step: 1489
i step: 1490
i step: 1491
i step: 1492
i step: 1493
i step: 1494
i step: 1495
i step: 1496
i step: 1497
i step: 1498
i step: 1499
i step: 1500
i step: 1501
i step: 1502
i step: 1503
i step: 1504
i step: 1505
i step: 1506
i step: 1507
i step: 1508
i step: 1509
i step: 1510
i step: 1511
i step: 1512
i step: 1513
i step: 1514
i step: 1515
i step: 1516
i step: 1517
i step: 1518
i step: 1519
i step: 1520
i step: 1521
i step: 1522
i step: 1523
i step: 1524
i step: 1525
i step: 1526
i step: 1527
i step: 1528
i step: 1529
i step: 1530
i step: 1531
i step: 1532
i step: 1533
i step: 1534
i step: 1535
i step: 1536
i step: 1537
i step: 1538
i step: 1539
i step: 1540
i step: 1541
i step: 1542
i step: 1543
i step: 1544
i step: 1545
i step: 1546
i step: 1547
i step: 1548
i step: 1549
i step: 1550
i step: 1551
i step: 1552
i step: 1553
i step: 1554
i step: 1555
i step: 1556
i step: 1557
i step: 1558
i step: 1559
i step: 1560
i step: 1561
i step: 1562
i step: 1563
i step: 1564
i step: 1565
i step: 1566
i step: 1567
i step: 1568
i step: 1569
i step: 1570
i step: 1571
i step: 1572
i step: 1573
i step: 1574
i step: 1575
i step: 1576
i step: 1577
i step: 1578
i step: 1579
i step: 1580
i step: 1581
i step: 1582
i step: 1583
i step: 1584
i step: 1585
i step: 1586
i step: 1587
i step: 1588
i step: 1589
i step: 1590
i step: 1591
i step: 1592
i step: 1593
i step: 1594
i step: 1595
i step: 1596
i step: 1597
i step: 1598
i step: 1599
i step: 1600
i step: 1601
i step: 1602
i step: 1603
i step: 1604
i step: 1605
i step: 1606
i step: 1607
i step: 1608
i step: 1609
i step: 1610
i step: 1611
i step: 1612
i step: 1613
i step: 1614
i step: 1615
i step: 1616
i step: 1617
i step: 1618
i step: 1619
i step: 1620
i step: 1621
i step: 1622
i step: 1623
i step: 1624
i step: 1625
i step: 1626
i step: 1627
i step: 1628
i step: 1629
i step: 1630
i step: 1631
i step: 1632
i step: 1633
i step: 1634
i step: 1635
i step: 1636
i step: 1637
i step: 1638
i step: 1639
i step: 1640
i step: 1641
i step: 1642
i step: 1643
i step: 1644
i step: 1645
i step: 1646
i step: 1647
i step: 1648
i step: 1649
i step: 1650
i step: 1651
i step: 1652
i step: 1653
i step: 1654
i step: 1655
i step: 1656
i step: 1657
i step: 1658
i step: 1659
i step: 1660
i step: 1661
i step: 1662
i step: 1663
i step: 1664
i step: 1665
i step: 1666
i step: 1667
i step: 1668
i step: 1669
i step: 1670
i step: 1671
i step: 1672
i step: 1673
i step: 1674
i step: 1675
i step: 1676
i step: 1677
i step: 1678
i step: 1679
i step: 1680
i step: 1681
i step: 1682
i step: 1683
i step: 1684
i step: 1685
i step: 1686
i step: 1687
i step: 1688
i step: 1689
i step: 1690
i step: 1691
i step: 1692
i step: 1693
i step: 1694
i step: 1695
i step: 1696
i step: 1697
i step: 1698
i step: 1699
i step: 1700
i step: 1701
i step: 1702
i step: 1703
i step: 1704
i step: 1705
i step: 1706
i step: 1707
i step: 1708
i step: 1709
i step: 1710
i step: 1711
i step: 1712
i step: 1713
i step: 1714
i step: 1715
i step: 1716
i step: 1717
i step: 1718
i step: 1719
i step: 1720
i step: 1721
i step: 1722
i step: 1723
i step: 1724
i step: 1725
i step: 1726
i step: 1727
i step: 1728
i step: 1729
i step: 1730
i step: 1731
i step: 1732
i step: 1733
i step: 1734
i step: 1735
i step: 1736
i step: 1737
i step: 1738
i step: 1739
i step: 1740
i step: 1741
i step: 1742
i step: 1743
i step: 1744
i step: 1745
i step: 1746
i step: 1747
i step: 1748
i step: 1749
i step: 1750
i step: 1751
i step: 1752
i step: 1753
i step: 1754
i step: 1755
i step: 1756
i step: 1757
i step: 1758
i step: 1759
i step: 1760
i step: 1761
i step: 1762
i step: 1763
i step: 1764
i step: 1765
i step: 1766
i step: 1767
i step: 1768
i step: 1769
i step: 1770
i step: 1771
i step: 1772
i step: 1773
i step: 1774
i step: 1775
i step: 1776
i step: 1777
i step: 1778
i step: 1779
i step: 1780
i step: 1781
i step: 1782
i step: 1783
i step: 1784
i step: 1785
i step: 1786
i step: 1787
i step: 1788
i step: 1789
i step: 1790
i step: 1791
i step: 1792
i step: 1793
i step: 1794
i step: 1795
i step: 1796
i step: 1797
i step: 1798
i step: 1799
i step: 1800
i step: 1801
i step: 1802
i step: 1803
i step: 1804
i step: 1805
i step: 1806
i step: 1807
i step: 1808
i step: 1809
i step: 1810
i step: 1811
i step: 1812
i step: 1813
i step: 1814
i step: 1815
i step: 1816
i step: 1817
i step: 1818
i step: 1819
i step: 1820
i step: 1821
i step: 1822
i step: 1823
i step: 1824
i step: 1825
i step: 1826
i step: 1827
i step: 1828
i step: 1829
i step: 1830
i step: 1831
i step: 1832
i step: 1833
i step: 1834
i step: 1835
i step: 1836
i step: 1837
i step: 1838
i step: 1839
i step: 1840
i step: 1841
i step: 1842
i step: 1843
i step: 1844
i step: 1845
i step: 1846
i step: 1847
i step: 1848
i step: 1849
i step: 1850
i step: 1851
i step: 1852
i step: 1853
i step: 1854
i step: 1855
i step: 1856
i step: 1857
i step: 1858
i step: 1859
i step: 1860
i step: 1861
i step: 1862
i step: 1863
i step: 1864
i step: 1865
i step: 1866
i step: 1867
i step: 1868
i step: 1869
i step: 1870
i step: 1871
i step: 1872
i step: 1873
i step: 1874
i step: 1875
i step: 1876
i step: 1877
i step: 1878
i step: 1879
i step: 1880
i step: 1881
i step: 1882
i step: 1883
i step: 1884
i step: 1885
i step: 1886
i step: 1887
i step: 1888
i step: 1889
i step: 1890
i step: 1891
i step: 1892
i step: 1893
i step: 1894
i step: 1895
i step: 1896
i step: 1897
i step: 1898
i step: 1899
i step: 1900
i step: 1901
i step: 1902
i step: 1903
i step: 1904
i step: 1905
i step: 1906
i step: 1907
i step: 1908
i step: 1909
i step: 1910
i step: 1911
i step: 1912
i step: 1913
i step: 1914
i step: 1915
i step: 1916
i step: 1917
i step: 1918
i step: 1919
i step: 1920
i step: 1921
i step: 1922
i step: 1923
i step: 1924
i step: 1925
i step: 1926
i step: 1927
i step: 1928
i step: 1929
i step: 1930
i step: 1931
i step: 1932
i step: 1933
i step: 1934
i step: 1935
i step: 1936
i step: 1937
i step: 1938
i step: 1939
i step: 1940
i step: 1941
i step: 1942
i step: 1943
i step: 1944
i step: 1945
i step: 1946
i step: 1947
i step: 1948
i step: 1949
i step: 1950
i step: 1951
i step: 1952
i step: 1953
i step: 1954
i step: 1955
i step: 1956
i step: 1957
i step: 1958
i step: 1959
i step: 1960
i step: 1961
i step: 1962
i step: 1963
i step: 1964
i step: 1965
i step: 1966
i step: 1967
i step: 1968
i step: 1969
i step: 1970
i step: 1971
i step: 1972
i step: 1973
i step: 1974
i step: 1975
i step: 1976
i step: 1977
i step: 1978
i step: 1979
i step: 1980
i step: 1981
i step: 1982
i step: 1983
i step: 1984
i step: 1985
i step: 1986
i step: 1987
i step: 1988
i step: 1989
i step: 1990
i step: 1991
i step: 1992
i step: 1993
i step: 1994
i step: 1995
i step: 1996
i step: 1997
i step: 1998
i step: 1999
i step: 2000
i OVER
In [194]:
comp_df1.to_csv('ProvProvData.csv')
In [195]:
comp_df1.sort_values('CommonWords', ascending=False).head()
Out[195]:
Group LikeGroup CommonWords GroupFraud LikeGroupFraud TotalGroup TotalLikeGroup PCT
1794805 PRV54070 PRV54092 19 Yes No 21 20 90.0
1624120 PRV54092 PRV54070 19 No Yes 20 21 95.0
62541 PRV52065 PRV52019 9 Yes Yes 11 18 82.0
236697 PRV55957 PRV56015 9 Yes No 14 12 64.0
26480 PRV52019 PRV52065 9 Yes Yes 18 11 50.0
In [196]:
Groups = comp_df1.sort_values('CommonWords', ascending=False).head(30)
In [197]:
Groups['Group'].unique()
Out[197]:
array(['PRV54070', 'PRV54092', 'PRV52065', 'PRV55957', 'PRV52019',
       'PRV56015', 'PRV57176', 'PRV57224', 'PRV57209', 'PRV55192',
       'PRV55234', 'PRV52014', 'PRV52126', 'PRV51479', 'PRV55230',
       'PRV54564', 'PRV57572', 'PRV54578', 'PRV52486', 'PRV57519',
       'PRV57528', 'PRV51578', 'PRV52492', 'PRV57521', 'PRV52837',
       'PRV52488'], dtype=object)
In [198]:
Groups['LikeGroup'].unique()
Out[198]:
array(['PRV54092', 'PRV54070', 'PRV52019', 'PRV56015', 'PRV52065',
       'PRV55957', 'PRV57224', 'PRV57176', 'PRV57209', 'PRV55234',
       'PRV55192', 'PRV52126', 'PRV52014', 'PRV51578', 'PRV54578',
       'PRV57521', 'PRV54564', 'PRV52492', 'PRV57528', 'PRV57519',
       'PRV51479', 'PRV55230', 'PRV52486', 'PRV57572', 'PRV52873'],
      dtype=object)
In [199]:
ProviderRel2 = claims[['Provider','AttendingPhysician','PotentialFraud' ]]
In [200]:
newGroup = ProviderRel2[(ProviderRel2['Provider'].isin(Groups['Group'].unique())) |
            (ProviderRel2['Provider'].isin(Groups['LikeGroup'].unique()))].drop_duplicates()
In [201]:
newGroup.head()
Out[201]:
Provider AttendingPhysician PotentialFraud
23 PRV51578 PHY378170 Yes
46 PRV52019 PHY351641 Yes
90 PRV55230 PHY333406 Yes
164 PRV51578 PHY346389 Yes
177 PRV52019 PHY416959 Yes
In [202]:
newGroup.shape
Out[202]:
(2967, 3)
In [203]:
FGa = nx.from_pandas_edgelist(newGroup, source='Provider',
                             target='AttendingPhysician')
In [204]:
fraud1 = fraud
fraud1 = fraud1.reset_index()
fraud1 = fraud1[fraud1['Provider'].isin(newGroup.Provider)]
In [205]:
Ben = newGroup[['AttendingPhysician','PotentialFraud']]
Ben.PotentialFraud = 'Att'
Ben = Ben.drop_duplicates()
Ben = Ben.rename(columns={"AttendingPhysician": "Provider"})
fraud2 = fraud1.append(Ben)
In [206]:
fraud1.head()
Out[206]:
Provider PotentialFraud
380 PRV51479 No
458 PRV51578 Yes
816 PRV52014 No
818 PRV52019 Yes
854 PRV52065 Yes
In [207]:
fraud2 = fraud2.set_index('Provider')
In [208]:
nx.set_node_attributes(FGa, name = 'Fraud', values = pd.Series(fraud2.PotentialFraud).to_dict())
#nx.set_node_attributes(FGa, 'gender', pd.Series(nodes.gender, index=nodes.node).to_dict())
In [209]:
nx.get_node_attributes(FGa, 'Fraud')
Out[209]:
{'PRV51578': 'Yes',
 'PHY378170': 'Att',
 'PRV52019': 'Yes',
 'PHY351641': 'Att',
 'PRV55230': 'Yes',
 'PHY333406': 'Att',
 'PHY346389': 'Att',
 'PHY416959': 'Att',
 'PRV52065': 'Yes',
 'PHY349113': 'Att',
 'PHY355567': 'Att',
 'PHY386778': 'Att',
 'PHY395933': 'Att',
 'PHY401599': 'Att',
 'PHY411720': 'Att',
 'PRV52126': 'No',
 'PHY403849': 'Att',
 'PHY349423': 'Att',
 'PHY428365': 'Att',
 'PHY418842': 'Att',
 'PHY360449': 'Att',
 'PHY349478': 'Att',
 'PHY406635': 'Att',
 'PHY412347': 'Att',
 'PHY313016': 'Att',
 'PHY405470': 'Att',
 'PHY376123': 'Att',
 'PHY313437': 'Att',
 'PHY388158': 'Att',
 'PRV55192': 'No',
 'PHY374234': 'Att',
 'PHY359004': 'Att',
 'PHY393952': 'Att',
 'PHY424531': 'Att',
 'PHY380738': 'Att',
 'PHY331475': 'Att',
 'PHY347413': 'Att',
 'PRV57521': 'No',
 'PHY411423': 'Att',
 'PHY366173': 'Att',
 'PHY397753': 'Att',
 'PHY335174': 'Att',
 'PHY404769': 'Att',
 'PRV56015': 'No',
 'PHY416370': 'Att',
 'PHY326013': 'Att',
 'PHY420653': 'Att',
 'PHY313129': 'Att',
 'PRV55957': 'Yes',
 'PHY374497': 'Att',
 'PHY412336': 'Att',
 'PHY376420': 'Att',
 'PHY399934': 'Att',
 'PHY356349': 'Att',
 'PHY365698': 'Att',
 'PHY321972': 'Att',
 'PHY431785': 'Att',
 'PHY398680': 'Att',
 'PHY363222': 'Att',
 'PHY385926': 'Att',
 'PRV57519': 'No',
 'PHY311138': 'Att',
 'PHY338446': 'Att',
 'PHY348831': 'Att',
 'PHY337065': 'Att',
 'PHY418516': 'Att',
 'PHY388412': 'Att',
 'PHY352317': 'Att',
 'PHY371902': 'Att',
 'PHY334208': 'Att',
 'PHY389703': 'Att',
 'PRV57209': 'Yes',
 'PHY397389': 'Att',
 'PHY386703': 'Att',
 'PHY349001': 'Att',
 'PHY357098': 'Att',
 'PHY422871': 'Att',
 'PHY412944': 'Att',
 'PHY331004': 'Att',
 'PHY404380': 'Att',
 'PHY332241': 'Att',
 'PHY425930': 'Att',
 'PHY408629': 'Att',
 'PHY367126': 'Att',
 'PRV51479': 'No',
 'PHY401228': 'Att',
 'PHY354544': 'Att',
 'PHY402706': 'Att',
 'PHY318350': 'Att',
 'PHY384309': 'Att',
 'PRV57528': 'Yes',
 'PHY421123': 'Att',
 'PHY418643': 'Att',
 'PHY427016': 'Att',
 'PHY346575': 'Att',
 'PHY383521': 'Att',
 'PHY371496': 'Att',
 'PHY406279': 'Att',
 'PHY401389': 'Att',
 'PHY388043': 'Att',
 'PRV55234': 'No',
 'PHY312410': 'Att',
 'PHY388128': 'Att',
 'PHY319108': 'Att',
 'PHY406495': 'Att',
 'PHY317190': 'Att',
 'PHY366586': 'Att',
 'PHY402246': 'Att',
 'PHY412606': 'Att',
 'PHY432774': 'Att',
 'PHY430794': 'Att',
 'PHY316624': 'Att',
 'PHY382262': 'Att',
 'PHY324913': 'Att',
 'PHY351677': 'Att',
 'PHY322143': 'Att',
 'PHY375857': 'Att',
 'PHY354222': 'Att',
 'PHY401856': 'Att',
 'PHY425449': 'Att',
 'PHY386799': 'Att',
 'PHY373061': 'Att',
 'PHY346751': 'Att',
 'PHY400310': 'Att',
 'PHY317686': 'Att',
 'PHY342227': 'Att',
 'PHY414004': 'Att',
 'PHY374118': 'Att',
 'PHY328447': 'Att',
 'PHY311223': 'Att',
 'PHY364135': 'Att',
 'PHY330518': 'Att',
 'PHY317878': 'Att',
 'PHY399872': 'Att',
 'PHY411141': 'Att',
 'PHY326346': 'Att',
 'PHY316906': 'Att',
 'PHY358895': 'Att',
 'PHY338657': 'Att',
 'PHY371153': 'Att',
 'PHY429384': 'Att',
 'PHY401909': 'Att',
 'PHY323073': 'Att',
 'PHY402680': 'Att',
 'PHY422974': 'Att',
 'PHY314836': 'Att',
 'PHY348595': 'Att',
 'PHY380100': 'Att',
 'PHY416384': 'Att',
 'PHY424468': 'Att',
 'PHY346221': 'Att',
 'PHY428908': 'Att',
 'PHY382940': 'Att',
 'PHY330380': 'Att',
 'PHY356320': 'Att',
 'PHY334517': 'Att',
 'PHY410565': 'Att',
 'PHY397497': 'Att',
 'PHY362110': 'Att',
 'PHY402242': 'Att',
 'PHY427577': 'Att',
 'PHY419839': 'Att',
 'PHY386625': 'Att',
 'PHY329441': 'Att',
 'PHY410774': 'Att',
 'PHY392513': 'Att',
 'PHY378741': 'Att',
 'PHY388468': 'Att',
 'PHY331366': 'Att',
 'PHY394773': 'Att',
 'PHY318309': 'Att',
 'PHY431968': 'Att',
 'PHY319271': 'Att',
 'PHY355885': 'Att',
 'PHY400817': 'Att',
 'PHY414970': 'Att',
 'PHY412022': 'Att',
 'PHY431594': 'Att',
 'PHY327740': 'Att',
 'PHY356809': 'Att',
 'PHY403219': 'Att',
 'PHY400937': 'Att',
 'PHY407687': 'Att',
 'PHY311333': 'Att',
 'PHY335403': 'Att',
 'PHY393304': 'Att',
 'PHY409075': 'Att',
 'PHY388241': 'Att',
 'PHY331855': 'Att',
 'PHY338744': 'Att',
 'PHY369171': 'Att',
 'PHY352932': 'Att',
 'PHY338186': 'Att',
 'PHY397555': 'Att',
 'PHY388950': 'Att',
 'PHY399558': 'Att',
 'PHY412756': 'Att',
 'PHY398242': 'Att',
 'PHY343523': 'Att',
 'PHY325635': 'Att',
 'PHY426826': 'Att',
 'PHY430938': 'Att',
 'PHY351532': 'Att',
 'PHY415964': 'Att',
 'PHY319710': 'Att',
 'PHY324520': 'Att',
 'PHY320692': 'Att',
 'PRV57176': 'No',
 'PHY333203': 'Att',
 'PHY403364': 'Att',
 'PHY412017': 'Att',
 'PHY398674': 'Att',
 'PHY334875': 'Att',
 'PHY347571': 'Att',
 'PHY370448': 'Att',
 'PHY413760': 'Att',
 'PHY375716': 'Att',
 'PHY327590': 'Att',
 'PHY411848': 'Att',
 'PHY378405': 'Att',
 'PHY393557': 'Att',
 'PHY328045': 'Att',
 'PHY397479': 'Att',
 'PHY328979': 'Att',
 'PHY341492': 'Att',
 'PHY363331': 'Att',
 'PHY413474': 'Att',
 'PHY381561': 'Att',
 'PHY424264': 'Att',
 'PHY396016': 'Att',
 'PHY388143': 'Att',
 'PHY414516': 'Att',
 'PHY414254': 'Att',
 'PHY388636': 'Att',
 'PHY414513': 'Att',
 'PHY376351': 'Att',
 'PHY328274': 'Att',
 'PHY354025': 'Att',
 'PHY328135': 'Att',
 'PHY320166': 'Att',
 'PHY321511': 'Att',
 'PHY411270': 'Att',
 'PHY393528': 'Att',
 'PHY317722': 'Att',
 'PHY409892': 'Att',
 'PHY348478': 'Att',
 'PHY316306': 'Att',
 'PHY392498': 'Att',
 'PHY409153': 'Att',
 'PHY425454': 'Att',
 'PHY398992': 'Att',
 'PHY405700': 'Att',
 'PHY327965': 'Att',
 'PHY414809': 'Att',
 'PHY417932': 'Att',
 'PHY424220': 'Att',
 'PHY409462': 'Att',
 'PHY341744': 'Att',
 'PHY321282': 'Att',
 'PRV52837': 'No',
 'PHY363474': 'Att',
 'PHY342882': 'Att',
 'PHY361542': 'Att',
 'PHY348371': 'Att',
 'PHY347360': 'Att',
 'PHY425477': 'Att',
 'PHY428668': 'Att',
 'PHY346478': 'Att',
 'PHY432366': 'Att',
 'PHY315139': 'Att',
 'PHY358692': 'Att',
 'PHY428798': 'Att',
 'PHY339652': 'Att',
 'PHY360501': 'Att',
 'PHY313742': 'Att',
 'PHY432058': 'Att',
 'PHY354063': 'Att',
 'PHY392477': 'Att',
 'PHY385026': 'Att',
 'PHY417116': 'Att',
 'PHY380823': 'Att',
 'PHY316601': 'Att',
 'PHY397187': 'Att',
 'PHY393889': 'Att',
 'PHY387400': 'Att',
 'PHY397523': 'Att',
 'PHY391171': 'Att',
 'PHY408104': 'Att',
 'PHY333221': 'Att',
 'PHY363836': 'Att',
 'PHY383714': 'Att',
 'PHY383550': 'Att',
 'PHY358887': 'Att',
 'PHY317076': 'Att',
 'PHY361568': 'Att',
 'PHY403016': 'Att',
 'PHY353560': 'Att',
 'PHY386362': 'Att',
 'PHY318344': 'Att',
 'PHY322607': 'Att',
 'PHY326200': 'Att',
 'PHY321951': 'Att',
 'PHY320522': 'Att',
 'PHY384809': 'Att',
 'PHY398935': 'Att',
 'PHY323864': 'Att',
 'PHY374950': 'Att',
 'PHY312794': 'Att',
 'PHY335704': 'Att',
 'PHY374925': 'Att',
 'PHY350061': 'Att',
 'PHY408021': 'Att',
 'PHY341854': 'Att',
 'PHY363189': 'Att',
 'PHY358698': 'Att',
 'PHY395504': 'Att',
 'PHY314919': 'Att',
 'PHY368036': 'Att',
 'PHY411575': 'Att',
 nan: 'Att',
 'PRV57224': 'No',
 'PHY422502': 'Att',
 'PHY384856': 'Att',
 'PHY333595': 'Att',
 'PHY429970': 'Att',
 'PHY339105': 'Att',
 'PHY389024': 'Att',
 'PHY428482': 'Att',
 'PHY364501': 'Att',
 'PHY407796': 'Att',
 'PHY424987': 'Att',
 'PHY398754': 'Att',
 'PHY392733': 'Att',
 'PHY318737': 'Att',
 'PHY374980': 'Att',
 'PHY336466': 'Att',
 'PHY368469': 'Att',
 'PHY346488': 'Att',
 'PHY337904': 'Att',
 'PHY416294': 'Att',
 'PHY333362': 'Att',
 'PHY397417': 'Att',
 'PHY399984': 'Att',
 'PHY357233': 'Att',
 'PHY379288': 'Att',
 'PHY378017': 'Att',
 'PHY362961': 'Att',
 'PHY342280': 'Att',
 'PHY414382': 'Att',
 'PHY360863': 'Att',
 'PHY366054': 'Att',
 'PHY338194': 'Att',
 'PHY405256': 'Att',
 'PHY342833': 'Att',
 'PHY402377': 'Att',
 'PHY400427': 'Att',
 'PHY352665': 'Att',
 'PHY398447': 'Att',
 'PHY379168': 'Att',
 'PHY313847': 'Att',
 'PHY381502': 'Att',
 'PHY328978': 'Att',
 'PHY362145': 'Att',
 'PHY354694': 'Att',
 'PHY312025': 'Att',
 'PHY350148': 'Att',
 'PHY375360': 'Att',
 'PHY341335': 'Att',
 'PHY323598': 'Att',
 'PHY373492': 'Att',
 'PHY425501': 'Att',
 'PHY430322': 'Att',
 'PHY320265': 'Att',
 'PHY320360': 'Att',
 'PHY362249': 'Att',
 'PHY386472': 'Att',
 'PHY424698': 'Att',
 'PHY366678': 'Att',
 'PHY416823': 'Att',
 'PHY401496': 'Att',
 'PHY344904': 'Att',
 'PHY410079': 'Att',
 'PHY400836': 'Att',
 'PHY342838': 'Att',
 'PHY329313': 'Att',
 'PHY432470': 'Att',
 'PHY340858': 'Att',
 'PHY390572': 'Att',
 'PHY380330': 'Att',
 'PHY365135': 'Att',
 'PHY338102': 'Att',
 'PHY389465': 'Att',
 'PHY347661': 'Att',
 'PHY343486': 'Att',
 'PHY404017': 'Att',
 'PHY365950': 'Att',
 'PHY317992': 'Att',
 'PHY312499': 'Att',
 'PHY432744': 'Att',
 'PHY422135': 'Att',
 'PHY433118': 'Att',
 'PHY312994': 'Att',
 'PHY426618': 'Att',
 'PHY431469': 'Att',
 'PHY396175': 'Att',
 'PHY375749': 'Att',
 'PHY355655': 'Att',
 'PHY354335': 'Att',
 'PHY333095': 'Att',
 'PHY326924': 'Att',
 'PHY339802': 'Att',
 'PHY319412': 'Att',
 'PHY312304': 'Att',
 'PHY349374': 'Att',
 'PHY328570': 'Att',
 'PHY417263': 'Att',
 'PHY354742': 'Att',
 'PHY412855': 'Att',
 'PHY427785': 'Att',
 'PHY389225': 'Att',
 'PHY320552': 'Att',
 'PHY433338': 'Att',
 'PHY375683': 'Att',
 'PHY344425': 'Att',
 'PHY412632': 'Att',
 'PHY389741': 'Att',
 'PHY413858': 'Att',
 'PHY364115': 'Att',
 'PHY375405': 'Att',
 'PHY417119': 'Att',
 'PHY409680': 'Att',
 'PHY410130': 'Att',
 'PHY341010': 'Att',
 'PHY353443': 'Att',
 'PHY410772': 'Att',
 'PHY382803': 'Att',
 'PHY392517': 'Att',
 'PHY408685': 'Att',
 'PHY335293': 'Att',
 'PHY400714': 'Att',
 'PHY373065': 'Att',
 'PHY338577': 'Att',
 'PHY358788': 'Att',
 'PRV52488': 'No',
 'PHY323399': 'Att',
 'PHY389249': 'Att',
 'PHY348243': 'Att',
 'PHY424077': 'Att',
 'PHY329593': 'Att',
 'PHY334168': 'Att',
 'PRV54564': 'No',
 'PHY387163': 'Att',
 'PHY326171': 'Att',
 'PHY427563': 'Att',
 'PHY401863': 'Att',
 'PHY317148': 'Att',
 'PRV54092': 'No',
 'PHY372465': 'Att',
 'PRV54070': 'Yes',
 'PHY405766': 'Att',
 'PRV52014': 'No',
 'PHY401864': 'Att',
 'PHY398339': 'Att',
 'PHY381413': 'Att',
 'PHY420151': 'Att',
 'PHY372995': 'Att',
 'PHY378431': 'Att',
 'PHY400157': 'Att',
 'PHY349905': 'Att',
 'PHY316442': 'Att',
 'PHY381222': 'Att',
 'PHY340274': 'Att',
 'PHY384110': 'Att',
 'PHY337795': 'Att',
 'PHY344534': 'Att',
 'PHY331019': 'Att',
 'PHY374447': 'Att',
 'PHY372170': 'Att',
 'PHY398682': 'Att',
 'PHY326182': 'Att',
 'PHY358148': 'Att',
 'PHY409635': 'Att',
 'PRV52492': 'No',
 'PHY413849': 'Att',
 'PHY346768': 'Att',
 'PHY390635': 'Att',
 'PHY322964': 'Att',
 'PHY334998': 'Att',
 'PHY363670': 'Att',
 'PHY420772': 'Att',
 'PHY330970': 'Att',
 'PRV57572': 'No',
 'PHY422423': 'Att',
 'PHY432870': 'Att',
 'PHY416093': 'Att',
 'PRV52486': 'No',
 'PHY414854': 'Att',
 'PHY360504': 'Att',
 'PHY312349': 'Att',
 'PHY331124': 'Att',
 'PHY389821': 'Att',
 'PHY401590': 'Att',
 'PHY391721': 'Att',
 'PHY355356': 'Att',
 'PHY324373': 'Att',
 'PHY329258': 'Att',
 'PHY324153': 'Att',
 'PHY386159': 'Att',
 'PHY332617': 'Att',
 'PHY394130': 'Att',
 'PHY324111': 'Att',
 'PHY400101': 'Att',
 'PHY381604': 'Att',
 'PHY343933': 'Att',
 'PHY382464': 'Att',
 'PHY388000': 'Att',
 'PHY393739': 'Att',
 'PHY317553': 'Att',
 'PHY431424': 'Att',
 'PHY383941': 'Att',
 'PHY376268': 'Att',
 'PHY328413': 'Att',
 'PHY376682': 'Att',
 'PHY341204': 'Att',
 'PHY364349': 'Att',
 'PHY323758': 'Att',
 'PHY400361': 'Att',
 'PHY349690': 'Att',
 'PHY423821': 'Att',
 'PHY413268': 'Att',
 'PHY319211': 'Att',
 'PHY368281': 'Att',
 'PHY356243': 'Att',
 'PHY351051': 'Att',
 'PHY331894': 'Att',
 'PHY321831': 'Att',
 'PRV54578': 'No',
 'PHY410754': 'Att',
 'PHY362667': 'Att',
 'PHY370007': 'Att',
 'PHY423977': 'Att',
 'PRV52873': 'No',
 'PHY402989': 'Att',
 'PHY332810': 'Att',
 'PHY334667': 'Att',
 'PHY378414': 'Att',
 'PHY401462': 'Att',
 'PHY368413': 'Att',
 'PHY365385': 'Att',
 'PHY341133': 'Att',
 'PHY414170': 'Att',
 'PHY351879': 'Att',
 'PHY433759': 'Att',
 'PHY311634': 'Att',
 'PHY359759': 'Att',
 'PHY354993': 'Att',
 'PHY371329': 'Att',
 'PHY407807': 'Att',
 'PHY374340': 'Att',
 'PHY371664': 'Att',
 'PHY313186': 'Att',
 'PHY345773': 'Att',
 'PHY334682': 'Att',
 'PHY322742': 'Att',
 'PHY389371': 'Att',
 'PHY422662': 'Att',
 'PHY363171': 'Att',
 'PHY380632': 'Att',
 'PHY385429': 'Att',
 'PHY419111': 'Att',
 'PHY421386': 'Att',
 'PHY333017': 'Att',
 'PHY409236': 'Att',
 'PHY330006': 'Att',
 'PHY382975': 'Att',
 'PHY410251': 'Att',
 'PHY400398': 'Att',
 'PHY402475': 'Att',
 'PHY373813': 'Att',
 'PHY378176': 'Att',
 'PHY424532': 'Att',
 'PHY317329': 'Att',
 'PHY367370': 'Att',
 'PHY393782': 'Att',
 'PHY367946': 'Att',
 'PHY405066': 'Att',
 'PHY357698': 'Att',
 'PHY396116': 'Att',
 'PHY405057': 'Att',
 'PHY355794': 'Att',
 'PHY403192': 'Att',
 'PHY341210': 'Att',
 'PHY385738': 'Att',
 'PHY347867': 'Att',
 'PHY365733': 'Att',
 'PHY383676': 'Att',
 'PHY329185': 'Att',
 'PHY313644': 'Att',
 'PHY318920': 'Att',
 'PHY398738': 'Att',
 'PHY342157': 'Att',
 'PHY394061': 'Att',
 'PHY330281': 'Att',
 'PHY424990': 'Att',
 'PHY363327': 'Att',
 'PHY312006': 'Att',
 'PHY341429': 'Att',
 'PHY352961': 'Att',
 'PHY370904': 'Att',
 'PHY390128': 'Att',
 'PHY315653': 'Att',
 'PHY327424': 'Att',
 'PHY424926': 'Att',
 'PHY361967': 'Att',
 'PHY348308': 'Att',
 'PHY314625': 'Att',
 'PHY380148': 'Att',
 'PHY365654': 'Att',
 'PHY396883': 'Att',
 'PHY403913': 'Att',
 'PHY427327': 'Att',
 'PHY323116': 'Att',
 'PHY364410': 'Att',
 'PHY368883': 'Att',
 'PHY318041': 'Att',
 'PHY369227': 'Att',
 'PHY392495': 'Att',
 'PHY381047': 'Att',
 'PHY334657': 'Att',
 'PHY384111': 'Att',
 'PHY326754': 'Att',
 'PHY320828': 'Att',
 'PHY399048': 'Att',
 'PHY403686': 'Att',
 'PHY420211': 'Att',
 'PHY404542': 'Att',
 'PHY387487': 'Att',
 'PHY400024': 'Att',
 'PHY425299': 'Att',
 'PHY368862': 'Att',
 'PHY348373': 'Att',
 'PHY371787': 'Att',
 'PHY396155': 'Att',
 'PHY318051': 'Att',
 'PHY311376': 'Att',
 'PHY395655': 'Att',
 'PHY319609': 'Att',
 'PHY348591': 'Att',
 'PHY401997': 'Att',
 'PHY332826': 'Att',
 'PHY385799': 'Att',
 'PHY317499': 'Att',
 'PHY400448': 'Att',
 'PHY313463': 'Att',
 'PHY365146': 'Att',
 'PHY338333': 'Att',
 'PHY397634': 'Att',
 'PHY359189': 'Att',
 'PHY363430': 'Att',
 'PHY337157': 'Att',
 'PHY321368': 'Att',
 'PHY427325': 'Att',
 'PHY429515': 'Att',
 'PHY344149': 'Att',
 'PHY399671': 'Att',
 'PHY312963': 'Att',
 'PHY354899': 'Att',
 'PHY324664': 'Att',
 'PHY432398': 'Att',
 'PHY334350': 'Att',
 'PHY424382': 'Att',
 'PHY419570': 'Att',
 'PHY390979': 'Att',
 'PHY328760': 'Att',
 'PHY425187': 'Att',
 'PHY353588': 'Att',
 'PHY358987': 'Att',
 'PHY379584': 'Att',
 'PHY357400': 'Att',
 'PHY393757': 'Att',
 'PHY393298': 'Att',
 'PHY315925': 'Att',
 'PHY428085': 'Att',
 'PHY385226': 'Att',
 'PHY353317': 'Att',
 'PHY368482': 'Att',
 'PHY365586': 'Att',
 'PHY393128': 'Att',
 'PHY406490': 'Att',
 'PHY342221': 'Att',
 'PHY413498': 'Att',
 'PHY358112': 'Att',
 'PHY321647': 'Att',
 'PHY410436': 'Att',
 'PHY415928': 'Att',
 'PHY345536': 'Att',
 'PHY375735': 'Att',
 'PHY340323': 'Att',
 'PHY356657': 'Att',
 'PHY434144': 'Att',
 'PHY336414': 'Att',
 'PHY316216': 'Att',
 'PHY409764': 'Att',
 'PHY433669': 'Att',
 'PHY366295': 'Att',
 'PHY340912': 'Att',
 'PHY374681': 'Att',
 'PHY342081': 'Att',
 'PHY422934': 'Att',
 'PHY419834': 'Att',
 'PHY350631': 'Att',
 'PHY402047': 'Att',
 'PHY327242': 'Att',
 'PHY425514': 'Att',
 'PHY387992': 'Att',
 'PHY401573': 'Att',
 'PHY363625': 'Att',
 'PHY414231': 'Att',
 'PHY348938': 'Att',
 'PHY403014': 'Att',
 'PHY336972': 'Att',
 'PHY364719': 'Att',
 'PHY354099': 'Att',
 'PHY361877': 'Att',
 'PHY359364': 'Att',
 'PHY415516': 'Att',
 'PHY336835': 'Att',
 'PHY365459': 'Att',
 'PHY347911': 'Att',
 'PHY321700': 'Att',
 'PHY401281': 'Att',
 'PHY348504': 'Att',
 'PHY374262': 'Att',
 'PHY339989': 'Att',
 'PHY412178': 'Att',
 'PHY389002': 'Att',
 'PHY313336': 'Att',
 'PHY357705': 'Att',
 'PHY405007': 'Att',
 'PHY415871': 'Att',
 'PHY325073': 'Att',
 'PHY350773': 'Att',
 'PHY340434': 'Att',
 'PHY420413': 'Att',
 'PHY364235': 'Att',
 'PHY347361': 'Att',
 'PHY390891': 'Att',
 'PHY338316': 'Att',
 'PHY412974': 'Att',
 'PHY368934': 'Att',
 'PHY388252': 'Att',
 'PHY393204': 'Att',
 'PHY410640': 'Att',
 'PHY405627': 'Att',
 'PHY313147': 'Att',
 'PHY396179': 'Att',
 'PHY378600': 'Att',
 'PHY428060': 'Att',
 'PHY397947': 'Att',
 'PHY373842': 'Att',
 'PHY313095': 'Att',
 'PHY374721': 'Att',
 'PHY397842': 'Att',
 'PHY344155': 'Att',
 'PHY373862': 'Att',
 'PHY401246': 'Att',
 'PHY386334': 'Att',
 'PHY421361': 'Att',
 'PHY373968': 'Att',
 'PHY315881': 'Att',
 'PHY424463': 'Att',
 'PHY401658': 'Att',
 'PHY385104': 'Att',
 'PHY409399': 'Att',
 'PHY404613': 'Att',
 'PHY348261': 'Att',
 'PHY330004': 'Att',
 'PHY368957': 'Att',
 'PHY399263': 'Att',
 'PHY357578': 'Att',
 'PHY387401': 'Att',
 'PHY412943': 'Att',
 'PHY328970': 'Att',
 'PHY356885': 'Att',
 'PHY359246': 'Att',
 'PHY405073': 'Att',
 'PHY419802': 'Att',
 'PHY391028': 'Att',
 'PHY357474': 'Att',
 'PHY347251': 'Att',
 'PHY356078': 'Att',
 'PHY332524': 'Att',
 'PHY342886': 'Att',
 'PHY387871': 'Att',
 'PHY405807': 'Att',
 'PHY348330': 'Att',
 'PHY333783': 'Att',
 'PHY331126': 'Att',
 'PHY376821': 'Att',
 'PHY373647': 'Att',
 'PHY347834': 'Att',
 'PHY411954': 'Att',
 'PHY348287': 'Att',
 'PHY381541': 'Att',
 'PHY317842': 'Att',
 'PHY369731': 'Att',
 'PHY349732': 'Att',
 'PHY417527': 'Att',
 'PHY386587': 'Att',
 'PHY384445': 'Att',
 'PHY433077': 'Att',
 'PHY411617': 'Att',
 'PHY343177': 'Att',
 'PHY395178': 'Att',
 'PHY423038': 'Att',
 'PHY401541': 'Att',
 'PHY419973': 'Att',
 'PHY326257': 'Att',
 'PHY355653': 'Att',
 'PHY330977': 'Att',
 'PHY383560': 'Att',
 'PHY357753': 'Att',
 'PHY403487': 'Att',
 'PHY359552': 'Att',
 'PHY336253': 'Att',
 'PHY400029': 'Att',
 'PHY352377': 'Att',
 'PHY340417': 'Att',
 'PHY339310': 'Att',
 'PHY430954': 'Att',
 'PHY421538': 'Att',
 'PHY398100': 'Att',
 'PHY333797': 'Att',
 'PHY351527': 'Att',
 'PHY399480': 'Att',
 'PHY344905': 'Att',
 'PHY390776': 'Att',
 'PHY400921': 'Att',
 'PHY338673': 'Att',
 'PHY400951': 'Att',
 'PHY333166': 'Att',
 'PHY331033': 'Att',
 'PHY424655': 'Att',
 'PHY354784': 'Att',
 'PHY333273': 'Att',
 'PHY327396': 'Att',
 'PHY433483': 'Att',
 'PHY327250': 'Att',
 'PHY331869': 'Att',
 'PHY414603': 'Att',
 'PHY364626': 'Att',
 'PHY433696': 'Att',
 'PHY319882': 'Att',
 'PHY381718': 'Att',
 'PHY319445': 'Att',
 'PHY369482': 'Att',
 'PHY373957': 'Att',
 'PHY401492': 'Att',
 'PHY376448': 'Att',
 'PHY416512': 'Att',
 'PHY410536': 'Att',
 'PHY427777': 'Att',
 'PHY384803': 'Att',
 'PHY376703': 'Att',
 'PHY376733': 'Att',
 'PHY381059': 'Att',
 'PHY346397': 'Att',
 'PHY374419': 'Att',
 'PHY332246': 'Att',
 'PHY424599': 'Att',
 'PHY422595': 'Att',
 'PHY394412': 'Att',
 'PHY328392': 'Att',
 'PHY313789': 'Att',
 'PHY381409': 'Att',
 'PHY384710': 'Att',
 'PHY400749': 'Att',
 'PHY401025': 'Att',
 'PHY383580': 'Att',
 'PHY349544': 'Att',
 'PHY391363': 'Att',
 'PHY389074': 'Att',
 'PHY312675': 'Att',
 'PHY330955': 'Att',
 'PHY336968': 'Att',
 'PHY388831': 'Att',
 'PHY363372': 'Att',
 'PHY376487': 'Att',
 'PHY340819': 'Att',
 'PHY346774': 'Att',
 'PHY393012': 'Att',
 'PHY422478': 'Att',
 'PHY389428': 'Att',
 'PHY327597': 'Att',
 'PHY368379': 'Att',
 'PHY390754': 'Att',
 'PHY414273': 'Att',
 'PHY411989': 'Att',
 'PHY398875': 'Att',
 'PHY433039': 'Att',
 'PHY344629': 'Att',
 'PHY329229': 'Att',
 'PHY410924': 'Att',
 'PHY413400': 'Att',
 'PHY361862': 'Att',
 'PHY431318': 'Att',
 'PHY375067': 'Att',
 'PHY421276': 'Att',
 'PHY407936': 'Att',
 'PHY385822': 'Att',
 'PHY318591': 'Att',
 'PHY362988': 'Att',
 'PHY359130': 'Att',
 'PHY400316': 'Att',
 'PHY320287': 'Att',
 'PHY323279': 'Att',
 'PHY384118': 'Att',
 'PHY324714': 'Att',
 'PHY423560': 'Att',
 'PHY413621': 'Att',
 'PHY416443': 'Att',
 'PHY381455': 'Att',
 'PHY371331': 'Att',
 'PHY418809': 'Att',
 'PHY424948': 'Att',
 'PHY418821': 'Att',
 'PHY341582': 'Att',
 'PHY384061': 'Att',
 'PHY389156': 'Att',
 'PHY426808': 'Att',
 'PHY341074': 'Att',
 'PHY349512': 'Att',
 'PHY383384': 'Att',
 'PHY429560': 'Att',
 'PHY351575': 'Att',
 'PHY383004': 'Att',
 'PHY387282': 'Att',
 'PHY359546': 'Att',
 'PHY387152': 'Att',
 'PHY326504': 'Att',
 'PHY377605': 'Att',
 'PHY313523': 'Att',
 'PHY365617': 'Att',
 'PHY419449': 'Att',
 'PHY316972': 'Att',
 'PHY412126': 'Att',
 'PHY317464': 'Att',
 'PHY346079': 'Att',
 'PHY311424': 'Att',
 'PHY350862': 'Att',
 'PHY358969': 'Att',
 'PHY356262': 'Att',
 'PHY411171': 'Att',
 'PHY417963': 'Att',
 'PHY412536': 'Att',
 'PHY393500': 'Att',
 'PHY395722': 'Att',
 'PHY348108': 'Att',
 'PHY314588': 'Att',
 'PHY386382': 'Att',
 'PHY320675': 'Att',
 'PHY317655': 'Att',
 'PHY425410': 'Att',
 'PHY338158': 'Att',
 'PHY315942': 'Att',
 'PHY322011': 'Att',
 'PHY423295': 'Att',
 'PHY408312': 'Att',
 'PHY349140': 'Att',
 'PHY423582': 'Att',
 'PHY322368': 'Att',
 'PHY331873': 'Att',
 'PHY339446': 'Att',
 'PHY370384': 'Att',
 'PHY418100': 'Att',
 'PHY376521': 'Att',
 'PHY312873': 'Att',
 'PHY365405': 'Att',
 'PHY346584': 'Att',
 'PHY345241': 'Att',
 'PHY428858': 'Att',
 'PHY419019': 'Att',
 'PHY353629': 'Att',
 'PHY427659': 'Att',
 'PHY403005': 'Att',
 'PHY374606': 'Att',
 'PHY433303': 'Att',
 'PHY415589': 'Att',
 'PHY329479': 'Att',
 'PHY330991': 'Att',
 'PHY356238': 'Att',
 'PHY361097': 'Att',
 'PHY371940': 'Att',
 'PHY425184': 'Att',
 'PHY325213': 'Att',
 'PHY363799': 'Att',
 'PHY319064': 'Att',
 'PHY361058': 'Att',
 'PHY338266': 'Att',
 'PHY377057': 'Att',
 ...}
In [210]:
from itertools import count
plt.figure(figsize=(20,20))
# get unique groups
groups = set(nx.get_node_attributes(FGa,'Fraud').values())
mapping = dict(zip(sorted(groups),count()))
nodes = FGa.nodes()
colors = [mapping[FGa.node[n]['Fraud']] for n in nodes]

# drawing nodes and edges separately so we can capture collection for colobar
pos = nx.spring_layout(FGa)
ec = nx.draw_networkx_edges(FGa, pos, alpha=0.2)
nc = nx.draw_networkx_nodes(FGa, pos, nodelist=nodes, node_color=colors, 
                            with_labels=False, node_size=10, cmap=plt.cm.jet)
#plt.colorbar(nc)
plt.axis('off')
plt.show()
In [211]:
len(FGa)
Out[211]:
2769
In [212]:
print(nx.info(FGa))
Name: 
Type: Graph
Number of nodes: 2769
Number of edges: 2967
Average degree:   2.1430
In [213]:
nx.get_node_attributes(FGa,'Fraud' )
Out[213]:
{'PRV51578': 'Yes',
 'PHY378170': 'Att',
 'PRV52019': 'Yes',
 'PHY351641': 'Att',
 'PRV55230': 'Yes',
 'PHY333406': 'Att',
 'PHY346389': 'Att',
 'PHY416959': 'Att',
 'PRV52065': 'Yes',
 'PHY349113': 'Att',
 'PHY355567': 'Att',
 'PHY386778': 'Att',
 'PHY395933': 'Att',
 'PHY401599': 'Att',
 'PHY411720': 'Att',
 'PRV52126': 'No',
 'PHY403849': 'Att',
 'PHY349423': 'Att',
 'PHY428365': 'Att',
 'PHY418842': 'Att',
 'PHY360449': 'Att',
 'PHY349478': 'Att',
 'PHY406635': 'Att',
 'PHY412347': 'Att',
 'PHY313016': 'Att',
 'PHY405470': 'Att',
 'PHY376123': 'Att',
 'PHY313437': 'Att',
 'PHY388158': 'Att',
 'PRV55192': 'No',
 'PHY374234': 'Att',
 'PHY359004': 'Att',
 'PHY393952': 'Att',
 'PHY424531': 'Att',
 'PHY380738': 'Att',
 'PHY331475': 'Att',
 'PHY347413': 'Att',
 'PRV57521': 'No',
 'PHY411423': 'Att',
 'PHY366173': 'Att',
 'PHY397753': 'Att',
 'PHY335174': 'Att',
 'PHY404769': 'Att',
 'PRV56015': 'No',
 'PHY416370': 'Att',
 'PHY326013': 'Att',
 'PHY420653': 'Att',
 'PHY313129': 'Att',
 'PRV55957': 'Yes',
 'PHY374497': 'Att',
 'PHY412336': 'Att',
 'PHY376420': 'Att',
 'PHY399934': 'Att',
 'PHY356349': 'Att',
 'PHY365698': 'Att',
 'PHY321972': 'Att',
 'PHY431785': 'Att',
 'PHY398680': 'Att',
 'PHY363222': 'Att',
 'PHY385926': 'Att',
 'PRV57519': 'No',
 'PHY311138': 'Att',
 'PHY338446': 'Att',
 'PHY348831': 'Att',
 'PHY337065': 'Att',
 'PHY418516': 'Att',
 'PHY388412': 'Att',
 'PHY352317': 'Att',
 'PHY371902': 'Att',
 'PHY334208': 'Att',
 'PHY389703': 'Att',
 'PRV57209': 'Yes',
 'PHY397389': 'Att',
 'PHY386703': 'Att',
 'PHY349001': 'Att',
 'PHY357098': 'Att',
 'PHY422871': 'Att',
 'PHY412944': 'Att',
 'PHY331004': 'Att',
 'PHY404380': 'Att',
 'PHY332241': 'Att',
 'PHY425930': 'Att',
 'PHY408629': 'Att',
 'PHY367126': 'Att',
 'PRV51479': 'No',
 'PHY401228': 'Att',
 'PHY354544': 'Att',
 'PHY402706': 'Att',
 'PHY318350': 'Att',
 'PHY384309': 'Att',
 'PRV57528': 'Yes',
 'PHY421123': 'Att',
 'PHY418643': 'Att',
 'PHY427016': 'Att',
 'PHY346575': 'Att',
 'PHY383521': 'Att',
 'PHY371496': 'Att',
 'PHY406279': 'Att',
 'PHY401389': 'Att',
 'PHY388043': 'Att',
 'PRV55234': 'No',
 'PHY312410': 'Att',
 'PHY388128': 'Att',
 'PHY319108': 'Att',
 'PHY406495': 'Att',
 'PHY317190': 'Att',
 'PHY366586': 'Att',
 'PHY402246': 'Att',
 'PHY412606': 'Att',
 'PHY432774': 'Att',
 'PHY430794': 'Att',
 'PHY316624': 'Att',
 'PHY382262': 'Att',
 'PHY324913': 'Att',
 'PHY351677': 'Att',
 'PHY322143': 'Att',
 'PHY375857': 'Att',
 'PHY354222': 'Att',
 'PHY401856': 'Att',
 'PHY425449': 'Att',
 'PHY386799': 'Att',
 'PHY373061': 'Att',
 'PHY346751': 'Att',
 'PHY400310': 'Att',
 'PHY317686': 'Att',
 'PHY342227': 'Att',
 'PHY414004': 'Att',
 'PHY374118': 'Att',
 'PHY328447': 'Att',
 'PHY311223': 'Att',
 'PHY364135': 'Att',
 'PHY330518': 'Att',
 'PHY317878': 'Att',
 'PHY399872': 'Att',
 'PHY411141': 'Att',
 'PHY326346': 'Att',
 'PHY316906': 'Att',
 'PHY358895': 'Att',
 'PHY338657': 'Att',
 'PHY371153': 'Att',
 'PHY429384': 'Att',
 'PHY401909': 'Att',
 'PHY323073': 'Att',
 'PHY402680': 'Att',
 'PHY422974': 'Att',
 'PHY314836': 'Att',
 'PHY348595': 'Att',
 'PHY380100': 'Att',
 'PHY416384': 'Att',
 'PHY424468': 'Att',
 'PHY346221': 'Att',
 'PHY428908': 'Att',
 'PHY382940': 'Att',
 'PHY330380': 'Att',
 'PHY356320': 'Att',
 'PHY334517': 'Att',
 'PHY410565': 'Att',
 'PHY397497': 'Att',
 'PHY362110': 'Att',
 'PHY402242': 'Att',
 'PHY427577': 'Att',
 'PHY419839': 'Att',
 'PHY386625': 'Att',
 'PHY329441': 'Att',
 'PHY410774': 'Att',
 'PHY392513': 'Att',
 'PHY378741': 'Att',
 'PHY388468': 'Att',
 'PHY331366': 'Att',
 'PHY394773': 'Att',
 'PHY318309': 'Att',
 'PHY431968': 'Att',
 'PHY319271': 'Att',
 'PHY355885': 'Att',
 'PHY400817': 'Att',
 'PHY414970': 'Att',
 'PHY412022': 'Att',
 'PHY431594': 'Att',
 'PHY327740': 'Att',
 'PHY356809': 'Att',
 'PHY403219': 'Att',
 'PHY400937': 'Att',
 'PHY407687': 'Att',
 'PHY311333': 'Att',
 'PHY335403': 'Att',
 'PHY393304': 'Att',
 'PHY409075': 'Att',
 'PHY388241': 'Att',
 'PHY331855': 'Att',
 'PHY338744': 'Att',
 'PHY369171': 'Att',
 'PHY352932': 'Att',
 'PHY338186': 'Att',
 'PHY397555': 'Att',
 'PHY388950': 'Att',
 'PHY399558': 'Att',
 'PHY412756': 'Att',
 'PHY398242': 'Att',
 'PHY343523': 'Att',
 'PHY325635': 'Att',
 'PHY426826': 'Att',
 'PHY430938': 'Att',
 'PHY351532': 'Att',
 'PHY415964': 'Att',
 'PHY319710': 'Att',
 'PHY324520': 'Att',
 'PHY320692': 'Att',
 'PRV57176': 'No',
 'PHY333203': 'Att',
 'PHY403364': 'Att',
 'PHY412017': 'Att',
 'PHY398674': 'Att',
 'PHY334875': 'Att',
 'PHY347571': 'Att',
 'PHY370448': 'Att',
 'PHY413760': 'Att',
 'PHY375716': 'Att',
 'PHY327590': 'Att',
 'PHY411848': 'Att',
 'PHY378405': 'Att',
 'PHY393557': 'Att',
 'PHY328045': 'Att',
 'PHY397479': 'Att',
 'PHY328979': 'Att',
 'PHY341492': 'Att',
 'PHY363331': 'Att',
 'PHY413474': 'Att',
 'PHY381561': 'Att',
 'PHY424264': 'Att',
 'PHY396016': 'Att',
 'PHY388143': 'Att',
 'PHY414516': 'Att',
 'PHY414254': 'Att',
 'PHY388636': 'Att',
 'PHY414513': 'Att',
 'PHY376351': 'Att',
 'PHY328274': 'Att',
 'PHY354025': 'Att',
 'PHY328135': 'Att',
 'PHY320166': 'Att',
 'PHY321511': 'Att',
 'PHY411270': 'Att',
 'PHY393528': 'Att',
 'PHY317722': 'Att',
 'PHY409892': 'Att',
 'PHY348478': 'Att',
 'PHY316306': 'Att',
 'PHY392498': 'Att',
 'PHY409153': 'Att',
 'PHY425454': 'Att',
 'PHY398992': 'Att',
 'PHY405700': 'Att',
 'PHY327965': 'Att',
 'PHY414809': 'Att',
 'PHY417932': 'Att',
 'PHY424220': 'Att',
 'PHY409462': 'Att',
 'PHY341744': 'Att',
 'PHY321282': 'Att',
 'PRV52837': 'No',
 'PHY363474': 'Att',
 'PHY342882': 'Att',
 'PHY361542': 'Att',
 'PHY348371': 'Att',
 'PHY347360': 'Att',
 'PHY425477': 'Att',
 'PHY428668': 'Att',
 'PHY346478': 'Att',
 'PHY432366': 'Att',
 'PHY315139': 'Att',
 'PHY358692': 'Att',
 'PHY428798': 'Att',
 'PHY339652': 'Att',
 'PHY360501': 'Att',
 'PHY313742': 'Att',
 'PHY432058': 'Att',
 'PHY354063': 'Att',
 'PHY392477': 'Att',
 'PHY385026': 'Att',
 'PHY417116': 'Att',
 'PHY380823': 'Att',
 'PHY316601': 'Att',
 'PHY397187': 'Att',
 'PHY393889': 'Att',
 'PHY387400': 'Att',
 'PHY397523': 'Att',
 'PHY391171': 'Att',
 'PHY408104': 'Att',
 'PHY333221': 'Att',
 'PHY363836': 'Att',
 'PHY383714': 'Att',
 'PHY383550': 'Att',
 'PHY358887': 'Att',
 'PHY317076': 'Att',
 'PHY361568': 'Att',
 'PHY403016': 'Att',
 'PHY353560': 'Att',
 'PHY386362': 'Att',
 'PHY318344': 'Att',
 'PHY322607': 'Att',
 'PHY326200': 'Att',
 'PHY321951': 'Att',
 'PHY320522': 'Att',
 'PHY384809': 'Att',
 'PHY398935': 'Att',
 'PHY323864': 'Att',
 'PHY374950': 'Att',
 'PHY312794': 'Att',
 'PHY335704': 'Att',
 'PHY374925': 'Att',
 'PHY350061': 'Att',
 'PHY408021': 'Att',
 'PHY341854': 'Att',
 'PHY363189': 'Att',
 'PHY358698': 'Att',
 'PHY395504': 'Att',
 'PHY314919': 'Att',
 'PHY368036': 'Att',
 'PHY411575': 'Att',
 nan: 'Att',
 'PRV57224': 'No',
 'PHY422502': 'Att',
 'PHY384856': 'Att',
 'PHY333595': 'Att',
 'PHY429970': 'Att',
 'PHY339105': 'Att',
 'PHY389024': 'Att',
 'PHY428482': 'Att',
 'PHY364501': 'Att',
 'PHY407796': 'Att',
 'PHY424987': 'Att',
 'PHY398754': 'Att',
 'PHY392733': 'Att',
 'PHY318737': 'Att',
 'PHY374980': 'Att',
 'PHY336466': 'Att',
 'PHY368469': 'Att',
 'PHY346488': 'Att',
 'PHY337904': 'Att',
 'PHY416294': 'Att',
 'PHY333362': 'Att',
 'PHY397417': 'Att',
 'PHY399984': 'Att',
 'PHY357233': 'Att',
 'PHY379288': 'Att',
 'PHY378017': 'Att',
 'PHY362961': 'Att',
 'PHY342280': 'Att',
 'PHY414382': 'Att',
 'PHY360863': 'Att',
 'PHY366054': 'Att',
 'PHY338194': 'Att',
 'PHY405256': 'Att',
 'PHY342833': 'Att',
 'PHY402377': 'Att',
 'PHY400427': 'Att',
 'PHY352665': 'Att',
 'PHY398447': 'Att',
 'PHY379168': 'Att',
 'PHY313847': 'Att',
 'PHY381502': 'Att',
 'PHY328978': 'Att',
 'PHY362145': 'Att',
 'PHY354694': 'Att',
 'PHY312025': 'Att',
 'PHY350148': 'Att',
 'PHY375360': 'Att',
 'PHY341335': 'Att',
 'PHY323598': 'Att',
 'PHY373492': 'Att',
 'PHY425501': 'Att',
 'PHY430322': 'Att',
 'PHY320265': 'Att',
 'PHY320360': 'Att',
 'PHY362249': 'Att',
 'PHY386472': 'Att',
 'PHY424698': 'Att',
 'PHY366678': 'Att',
 'PHY416823': 'Att',
 'PHY401496': 'Att',
 'PHY344904': 'Att',
 'PHY410079': 'Att',
 'PHY400836': 'Att',
 'PHY342838': 'Att',
 'PHY329313': 'Att',
 'PHY432470': 'Att',
 'PHY340858': 'Att',
 'PHY390572': 'Att',
 'PHY380330': 'Att',
 'PHY365135': 'Att',
 'PHY338102': 'Att',
 'PHY389465': 'Att',
 'PHY347661': 'Att',
 'PHY343486': 'Att',
 'PHY404017': 'Att',
 'PHY365950': 'Att',
 'PHY317992': 'Att',
 'PHY312499': 'Att',
 'PHY432744': 'Att',
 'PHY422135': 'Att',
 'PHY433118': 'Att',
 'PHY312994': 'Att',
 'PHY426618': 'Att',
 'PHY431469': 'Att',
 'PHY396175': 'Att',
 'PHY375749': 'Att',
 'PHY355655': 'Att',
 'PHY354335': 'Att',
 'PHY333095': 'Att',
 'PHY326924': 'Att',
 'PHY339802': 'Att',
 'PHY319412': 'Att',
 'PHY312304': 'Att',
 'PHY349374': 'Att',
 'PHY328570': 'Att',
 'PHY417263': 'Att',
 'PHY354742': 'Att',
 'PHY412855': 'Att',
 'PHY427785': 'Att',
 'PHY389225': 'Att',
 'PHY320552': 'Att',
 'PHY433338': 'Att',
 'PHY375683': 'Att',
 'PHY344425': 'Att',
 'PHY412632': 'Att',
 'PHY389741': 'Att',
 'PHY413858': 'Att',
 'PHY364115': 'Att',
 'PHY375405': 'Att',
 'PHY417119': 'Att',
 'PHY409680': 'Att',
 'PHY410130': 'Att',
 'PHY341010': 'Att',
 'PHY353443': 'Att',
 'PHY410772': 'Att',
 'PHY382803': 'Att',
 'PHY392517': 'Att',
 'PHY408685': 'Att',
 'PHY335293': 'Att',
 'PHY400714': 'Att',
 'PHY373065': 'Att',
 'PHY338577': 'Att',
 'PHY358788': 'Att',
 'PRV52488': 'No',
 'PHY323399': 'Att',
 'PHY389249': 'Att',
 'PHY348243': 'Att',
 'PHY424077': 'Att',
 'PHY329593': 'Att',
 'PHY334168': 'Att',
 'PRV54564': 'No',
 'PHY387163': 'Att',
 'PHY326171': 'Att',
 'PHY427563': 'Att',
 'PHY401863': 'Att',
 'PHY317148': 'Att',
 'PRV54092': 'No',
 'PHY372465': 'Att',
 'PRV54070': 'Yes',
 'PHY405766': 'Att',
 'PRV52014': 'No',
 'PHY401864': 'Att',
 'PHY398339': 'Att',
 'PHY381413': 'Att',
 'PHY420151': 'Att',
 'PHY372995': 'Att',
 'PHY378431': 'Att',
 'PHY400157': 'Att',
 'PHY349905': 'Att',
 'PHY316442': 'Att',
 'PHY381222': 'Att',
 'PHY340274': 'Att',
 'PHY384110': 'Att',
 'PHY337795': 'Att',
 'PHY344534': 'Att',
 'PHY331019': 'Att',
 'PHY374447': 'Att',
 'PHY372170': 'Att',
 'PHY398682': 'Att',
 'PHY326182': 'Att',
 'PHY358148': 'Att',
 'PHY409635': 'Att',
 'PRV52492': 'No',
 'PHY413849': 'Att',
 'PHY346768': 'Att',
 'PHY390635': 'Att',
 'PHY322964': 'Att',
 'PHY334998': 'Att',
 'PHY363670': 'Att',
 'PHY420772': 'Att',
 'PHY330970': 'Att',
 'PRV57572': 'No',
 'PHY422423': 'Att',
 'PHY432870': 'Att',
 'PHY416093': 'Att',
 'PRV52486': 'No',
 'PHY414854': 'Att',
 'PHY360504': 'Att',
 'PHY312349': 'Att',
 'PHY331124': 'Att',
 'PHY389821': 'Att',
 'PHY401590': 'Att',
 'PHY391721': 'Att',
 'PHY355356': 'Att',
 'PHY324373': 'Att',
 'PHY329258': 'Att',
 'PHY324153': 'Att',
 'PHY386159': 'Att',
 'PHY332617': 'Att',
 'PHY394130': 'Att',
 'PHY324111': 'Att',
 'PHY400101': 'Att',
 'PHY381604': 'Att',
 'PHY343933': 'Att',
 'PHY382464': 'Att',
 'PHY388000': 'Att',
 'PHY393739': 'Att',
 'PHY317553': 'Att',
 'PHY431424': 'Att',
 'PHY383941': 'Att',
 'PHY376268': 'Att',
 'PHY328413': 'Att',
 'PHY376682': 'Att',
 'PHY341204': 'Att',
 'PHY364349': 'Att',
 'PHY323758': 'Att',
 'PHY400361': 'Att',
 'PHY349690': 'Att',
 'PHY423821': 'Att',
 'PHY413268': 'Att',
 'PHY319211': 'Att',
 'PHY368281': 'Att',
 'PHY356243': 'Att',
 'PHY351051': 'Att',
 'PHY331894': 'Att',
 'PHY321831': 'Att',
 'PRV54578': 'No',
 'PHY410754': 'Att',
 'PHY362667': 'Att',
 'PHY370007': 'Att',
 'PHY423977': 'Att',
 'PRV52873': 'No',
 'PHY402989': 'Att',
 'PHY332810': 'Att',
 'PHY334667': 'Att',
 'PHY378414': 'Att',
 'PHY401462': 'Att',
 'PHY368413': 'Att',
 'PHY365385': 'Att',
 'PHY341133': 'Att',
 'PHY414170': 'Att',
 'PHY351879': 'Att',
 'PHY433759': 'Att',
 'PHY311634': 'Att',
 'PHY359759': 'Att',
 'PHY354993': 'Att',
 'PHY371329': 'Att',
 'PHY407807': 'Att',
 'PHY374340': 'Att',
 'PHY371664': 'Att',
 'PHY313186': 'Att',
 'PHY345773': 'Att',
 'PHY334682': 'Att',
 'PHY322742': 'Att',
 'PHY389371': 'Att',
 'PHY422662': 'Att',
 'PHY363171': 'Att',
 'PHY380632': 'Att',
 'PHY385429': 'Att',
 'PHY419111': 'Att',
 'PHY421386': 'Att',
 'PHY333017': 'Att',
 'PHY409236': 'Att',
 'PHY330006': 'Att',
 'PHY382975': 'Att',
 'PHY410251': 'Att',
 'PHY400398': 'Att',
 'PHY402475': 'Att',
 'PHY373813': 'Att',
 'PHY378176': 'Att',
 'PHY424532': 'Att',
 'PHY317329': 'Att',
 'PHY367370': 'Att',
 'PHY393782': 'Att',
 'PHY367946': 'Att',
 'PHY405066': 'Att',
 'PHY357698': 'Att',
 'PHY396116': 'Att',
 'PHY405057': 'Att',
 'PHY355794': 'Att',
 'PHY403192': 'Att',
 'PHY341210': 'Att',
 'PHY385738': 'Att',
 'PHY347867': 'Att',
 'PHY365733': 'Att',
 'PHY383676': 'Att',
 'PHY329185': 'Att',
 'PHY313644': 'Att',
 'PHY318920': 'Att',
 'PHY398738': 'Att',
 'PHY342157': 'Att',
 'PHY394061': 'Att',
 'PHY330281': 'Att',
 'PHY424990': 'Att',
 'PHY363327': 'Att',
 'PHY312006': 'Att',
 'PHY341429': 'Att',
 'PHY352961': 'Att',
 'PHY370904': 'Att',
 'PHY390128': 'Att',
 'PHY315653': 'Att',
 'PHY327424': 'Att',
 'PHY424926': 'Att',
 'PHY361967': 'Att',
 'PHY348308': 'Att',
 'PHY314625': 'Att',
 'PHY380148': 'Att',
 'PHY365654': 'Att',
 'PHY396883': 'Att',
 'PHY403913': 'Att',
 'PHY427327': 'Att',
 'PHY323116': 'Att',
 'PHY364410': 'Att',
 'PHY368883': 'Att',
 'PHY318041': 'Att',
 'PHY369227': 'Att',
 'PHY392495': 'Att',
 'PHY381047': 'Att',
 'PHY334657': 'Att',
 'PHY384111': 'Att',
 'PHY326754': 'Att',
 'PHY320828': 'Att',
 'PHY399048': 'Att',
 'PHY403686': 'Att',
 'PHY420211': 'Att',
 'PHY404542': 'Att',
 'PHY387487': 'Att',
 'PHY400024': 'Att',
 'PHY425299': 'Att',
 'PHY368862': 'Att',
 'PHY348373': 'Att',
 'PHY371787': 'Att',
 'PHY396155': 'Att',
 'PHY318051': 'Att',
 'PHY311376': 'Att',
 'PHY395655': 'Att',
 'PHY319609': 'Att',
 'PHY348591': 'Att',
 'PHY401997': 'Att',
 'PHY332826': 'Att',
 'PHY385799': 'Att',
 'PHY317499': 'Att',
 'PHY400448': 'Att',
 'PHY313463': 'Att',
 'PHY365146': 'Att',
 'PHY338333': 'Att',
 'PHY397634': 'Att',
 'PHY359189': 'Att',
 'PHY363430': 'Att',
 'PHY337157': 'Att',
 'PHY321368': 'Att',
 'PHY427325': 'Att',
 'PHY429515': 'Att',
 'PHY344149': 'Att',
 'PHY399671': 'Att',
 'PHY312963': 'Att',
 'PHY354899': 'Att',
 'PHY324664': 'Att',
 'PHY432398': 'Att',
 'PHY334350': 'Att',
 'PHY424382': 'Att',
 'PHY419570': 'Att',
 'PHY390979': 'Att',
 'PHY328760': 'Att',
 'PHY425187': 'Att',
 'PHY353588': 'Att',
 'PHY358987': 'Att',
 'PHY379584': 'Att',
 'PHY357400': 'Att',
 'PHY393757': 'Att',
 'PHY393298': 'Att',
 'PHY315925': 'Att',
 'PHY428085': 'Att',
 'PHY385226': 'Att',
 'PHY353317': 'Att',
 'PHY368482': 'Att',
 'PHY365586': 'Att',
 'PHY393128': 'Att',
 'PHY406490': 'Att',
 'PHY342221': 'Att',
 'PHY413498': 'Att',
 'PHY358112': 'Att',
 'PHY321647': 'Att',
 'PHY410436': 'Att',
 'PHY415928': 'Att',
 'PHY345536': 'Att',
 'PHY375735': 'Att',
 'PHY340323': 'Att',
 'PHY356657': 'Att',
 'PHY434144': 'Att',
 'PHY336414': 'Att',
 'PHY316216': 'Att',
 'PHY409764': 'Att',
 'PHY433669': 'Att',
 'PHY366295': 'Att',
 'PHY340912': 'Att',
 'PHY374681': 'Att',
 'PHY342081': 'Att',
 'PHY422934': 'Att',
 'PHY419834': 'Att',
 'PHY350631': 'Att',
 'PHY402047': 'Att',
 'PHY327242': 'Att',
 'PHY425514': 'Att',
 'PHY387992': 'Att',
 'PHY401573': 'Att',
 'PHY363625': 'Att',
 'PHY414231': 'Att',
 'PHY348938': 'Att',
 'PHY403014': 'Att',
 'PHY336972': 'Att',
 'PHY364719': 'Att',
 'PHY354099': 'Att',
 'PHY361877': 'Att',
 'PHY359364': 'Att',
 'PHY415516': 'Att',
 'PHY336835': 'Att',
 'PHY365459': 'Att',
 'PHY347911': 'Att',
 'PHY321700': 'Att',
 'PHY401281': 'Att',
 'PHY348504': 'Att',
 'PHY374262': 'Att',
 'PHY339989': 'Att',
 'PHY412178': 'Att',
 'PHY389002': 'Att',
 'PHY313336': 'Att',
 'PHY357705': 'Att',
 'PHY405007': 'Att',
 'PHY415871': 'Att',
 'PHY325073': 'Att',
 'PHY350773': 'Att',
 'PHY340434': 'Att',
 'PHY420413': 'Att',
 'PHY364235': 'Att',
 'PHY347361': 'Att',
 'PHY390891': 'Att',
 'PHY338316': 'Att',
 'PHY412974': 'Att',
 'PHY368934': 'Att',
 'PHY388252': 'Att',
 'PHY393204': 'Att',
 'PHY410640': 'Att',
 'PHY405627': 'Att',
 'PHY313147': 'Att',
 'PHY396179': 'Att',
 'PHY378600': 'Att',
 'PHY428060': 'Att',
 'PHY397947': 'Att',
 'PHY373842': 'Att',
 'PHY313095': 'Att',
 'PHY374721': 'Att',
 'PHY397842': 'Att',
 'PHY344155': 'Att',
 'PHY373862': 'Att',
 'PHY401246': 'Att',
 'PHY386334': 'Att',
 'PHY421361': 'Att',
 'PHY373968': 'Att',
 'PHY315881': 'Att',
 'PHY424463': 'Att',
 'PHY401658': 'Att',
 'PHY385104': 'Att',
 'PHY409399': 'Att',
 'PHY404613': 'Att',
 'PHY348261': 'Att',
 'PHY330004': 'Att',
 'PHY368957': 'Att',
 'PHY399263': 'Att',
 'PHY357578': 'Att',
 'PHY387401': 'Att',
 'PHY412943': 'Att',
 'PHY328970': 'Att',
 'PHY356885': 'Att',
 'PHY359246': 'Att',
 'PHY405073': 'Att',
 'PHY419802': 'Att',
 'PHY391028': 'Att',
 'PHY357474': 'Att',
 'PHY347251': 'Att',
 'PHY356078': 'Att',
 'PHY332524': 'Att',
 'PHY342886': 'Att',
 'PHY387871': 'Att',
 'PHY405807': 'Att',
 'PHY348330': 'Att',
 'PHY333783': 'Att',
 'PHY331126': 'Att',
 'PHY376821': 'Att',
 'PHY373647': 'Att',
 'PHY347834': 'Att',
 'PHY411954': 'Att',
 'PHY348287': 'Att',
 'PHY381541': 'Att',
 'PHY317842': 'Att',
 'PHY369731': 'Att',
 'PHY349732': 'Att',
 'PHY417527': 'Att',
 'PHY386587': 'Att',
 'PHY384445': 'Att',
 'PHY433077': 'Att',
 'PHY411617': 'Att',
 'PHY343177': 'Att',
 'PHY395178': 'Att',
 'PHY423038': 'Att',
 'PHY401541': 'Att',
 'PHY419973': 'Att',
 'PHY326257': 'Att',
 'PHY355653': 'Att',
 'PHY330977': 'Att',
 'PHY383560': 'Att',
 'PHY357753': 'Att',
 'PHY403487': 'Att',
 'PHY359552': 'Att',
 'PHY336253': 'Att',
 'PHY400029': 'Att',
 'PHY352377': 'Att',
 'PHY340417': 'Att',
 'PHY339310': 'Att',
 'PHY430954': 'Att',
 'PHY421538': 'Att',
 'PHY398100': 'Att',
 'PHY333797': 'Att',
 'PHY351527': 'Att',
 'PHY399480': 'Att',
 'PHY344905': 'Att',
 'PHY390776': 'Att',
 'PHY400921': 'Att',
 'PHY338673': 'Att',
 'PHY400951': 'Att',
 'PHY333166': 'Att',
 'PHY331033': 'Att',
 'PHY424655': 'Att',
 'PHY354784': 'Att',
 'PHY333273': 'Att',
 'PHY327396': 'Att',
 'PHY433483': 'Att',
 'PHY327250': 'Att',
 'PHY331869': 'Att',
 'PHY414603': 'Att',
 'PHY364626': 'Att',
 'PHY433696': 'Att',
 'PHY319882': 'Att',
 'PHY381718': 'Att',
 'PHY319445': 'Att',
 'PHY369482': 'Att',
 'PHY373957': 'Att',
 'PHY401492': 'Att',
 'PHY376448': 'Att',
 'PHY416512': 'Att',
 'PHY410536': 'Att',
 'PHY427777': 'Att',
 'PHY384803': 'Att',
 'PHY376703': 'Att',
 'PHY376733': 'Att',
 'PHY381059': 'Att',
 'PHY346397': 'Att',
 'PHY374419': 'Att',
 'PHY332246': 'Att',
 'PHY424599': 'Att',
 'PHY422595': 'Att',
 'PHY394412': 'Att',
 'PHY328392': 'Att',
 'PHY313789': 'Att',
 'PHY381409': 'Att',
 'PHY384710': 'Att',
 'PHY400749': 'Att',
 'PHY401025': 'Att',
 'PHY383580': 'Att',
 'PHY349544': 'Att',
 'PHY391363': 'Att',
 'PHY389074': 'Att',
 'PHY312675': 'Att',
 'PHY330955': 'Att',
 'PHY336968': 'Att',
 'PHY388831': 'Att',
 'PHY363372': 'Att',
 'PHY376487': 'Att',
 'PHY340819': 'Att',
 'PHY346774': 'Att',
 'PHY393012': 'Att',
 'PHY422478': 'Att',
 'PHY389428': 'Att',
 'PHY327597': 'Att',
 'PHY368379': 'Att',
 'PHY390754': 'Att',
 'PHY414273': 'Att',
 'PHY411989': 'Att',
 'PHY398875': 'Att',
 'PHY433039': 'Att',
 'PHY344629': 'Att',
 'PHY329229': 'Att',
 'PHY410924': 'Att',
 'PHY413400': 'Att',
 'PHY361862': 'Att',
 'PHY431318': 'Att',
 'PHY375067': 'Att',
 'PHY421276': 'Att',
 'PHY407936': 'Att',
 'PHY385822': 'Att',
 'PHY318591': 'Att',
 'PHY362988': 'Att',
 'PHY359130': 'Att',
 'PHY400316': 'Att',
 'PHY320287': 'Att',
 'PHY323279': 'Att',
 'PHY384118': 'Att',
 'PHY324714': 'Att',
 'PHY423560': 'Att',
 'PHY413621': 'Att',
 'PHY416443': 'Att',
 'PHY381455': 'Att',
 'PHY371331': 'Att',
 'PHY418809': 'Att',
 'PHY424948': 'Att',
 'PHY418821': 'Att',
 'PHY341582': 'Att',
 'PHY384061': 'Att',
 'PHY389156': 'Att',
 'PHY426808': 'Att',
 'PHY341074': 'Att',
 'PHY349512': 'Att',
 'PHY383384': 'Att',
 'PHY429560': 'Att',
 'PHY351575': 'Att',
 'PHY383004': 'Att',
 'PHY387282': 'Att',
 'PHY359546': 'Att',
 'PHY387152': 'Att',
 'PHY326504': 'Att',
 'PHY377605': 'Att',
 'PHY313523': 'Att',
 'PHY365617': 'Att',
 'PHY419449': 'Att',
 'PHY316972': 'Att',
 'PHY412126': 'Att',
 'PHY317464': 'Att',
 'PHY346079': 'Att',
 'PHY311424': 'Att',
 'PHY350862': 'Att',
 'PHY358969': 'Att',
 'PHY356262': 'Att',
 'PHY411171': 'Att',
 'PHY417963': 'Att',
 'PHY412536': 'Att',
 'PHY393500': 'Att',
 'PHY395722': 'Att',
 'PHY348108': 'Att',
 'PHY314588': 'Att',
 'PHY386382': 'Att',
 'PHY320675': 'Att',
 'PHY317655': 'Att',
 'PHY425410': 'Att',
 'PHY338158': 'Att',
 'PHY315942': 'Att',
 'PHY322011': 'Att',
 'PHY423295': 'Att',
 'PHY408312': 'Att',
 'PHY349140': 'Att',
 'PHY423582': 'Att',
 'PHY322368': 'Att',
 'PHY331873': 'Att',
 'PHY339446': 'Att',
 'PHY370384': 'Att',
 'PHY418100': 'Att',
 'PHY376521': 'Att',
 'PHY312873': 'Att',
 'PHY365405': 'Att',
 'PHY346584': 'Att',
 'PHY345241': 'Att',
 'PHY428858': 'Att',
 'PHY419019': 'Att',
 'PHY353629': 'Att',
 'PHY427659': 'Att',
 'PHY403005': 'Att',
 'PHY374606': 'Att',
 'PHY433303': 'Att',
 'PHY415589': 'Att',
 'PHY329479': 'Att',
 'PHY330991': 'Att',
 'PHY356238': 'Att',
 'PHY361097': 'Att',
 'PHY371940': 'Att',
 'PHY425184': 'Att',
 'PHY325213': 'Att',
 'PHY363799': 'Att',
 'PHY319064': 'Att',
 'PHY361058': 'Att',
 'PHY338266': 'Att',
 'PHY377057': 'Att',
 ...}
In [192]:
#plt.figure(figsize=(20,20))
#nx.draw(FGa, 
#        with_labels = False,
#        font_size = 5, 
#        node_color=['red', 'blue', 'orange'],
#        node_size = 200
#       )   
#plt.show()
In [90]:
plt.figure(figsize=(20,20))
nx.draw(FGa, 
        with_labels = False,
        font_size = 5, 
        #node_color=['red', 'blue'],
        node_size = 100
       )   
plt.show()
In [11]:
FG = nx.from_pandas_edgelist(ProviderRel.head(10000), source='Provider',
                             target='BeneID', edge_attr=True)
In [12]:
len(FG)
Out[12]:
9300
In [13]:
print(nx.info(FG))
Name: 
Type: Graph
Number of nodes: 9300
Number of edges: 9071
Average degree:   1.9508
In [14]:
plt.figure(figsize=(10,8))
nx.draw(FG)   
plt.show()

Subset Data

Fraud Yes

In [15]:
FraudYes = ProviderRel[ProviderRel['PotentialFraud']== 'Yes']
In [16]:
FG1 = nx.from_pandas_edgelist(FraudYes, source='Provider',
                             target='BeneID')
In [17]:
print(nx.info(FG1))
Name: 
Type: Graph
Number of nodes: 84503
Number of edges: 122463
Average degree:   2.8984
In [ ]:
plt.figure(figsize=(10,8))
nx.draw(FG1, with_labels = True, node_size = 5000, font_size = 20)   
plt.show()
In [ ]:
FraudYes['Provider'].value_counts()
Active Provider
In [ ]:
OneProvider = FraudYes[FraudYes['Provider'] == 'PRV54895']
In [ ]:
FG2 = nx.from_pandas_edgelist(OneProvider, source='Provider',
                             target='BeneID')
In [ ]:
print(nx.info(FG2))
In [ ]:
plt.figure(figsize=(10,8))
nx.draw(FG2)   
plt.show()

Group Data

Based on Provider and Attending Pysican

In [ ]:
ProviderAtt = claims[['Provider','AttendingPhysician','PotentialFraud' ]]
In [29]:
ProviderAtt.head()
Out[29]:
Provider AttendingPhysician PotentialFraud
0 PRV55912 PHY390922 Yes
1 PRV55907 PHY318495 No
2 PRV56046 PHY372395 No
3 PRV52405 PHY369659 No
4 PRV56614 PHY379376 No
In [31]:
ProviderAtt.shape
Out[31]:
(558211, 3)
In [34]:
FG3 = nx.from_pandas_edgelist(ProviderAtt, source='Provider',
                             target='AttendingPhysician', edge_attr=True)
In [35]:
print(nx.info(FG3))
Name: 
Type: Graph
Number of nodes: 87474
Number of edges: 88810
Average degree:   2.0305
In [193]:
#FG3.nodes(data=True)
In [ ]:
#plt.figure(figsize=(10,8))
#nx.draw(FG3, node_color=['red', 'blue'])   
#plt.show()

END